2016-06-14 54 views
2

数字是可选的,并且只允许在单词的结尾处使用什么是一个很好的正则表达式来匹配一个单词与可选空间?

空格是可选的,并且只允许在单词的中间。

我非常简单,只是想在几种语言匹配可能几个月,说英语和越南语

例如,以下是有效的匹配:

'June' 'tháng 6'

但以下是不是因为空间:'June '' June'

这是我的测试案例:https://regex101.com/r/pZ0mN3/2

正如你所看到的,我想出了^\S[\S ]+\S$这是一种工作,但我不知道是否有更好的方法来做到这一点。

+0

你的意思是*中间的一个词*,真正的中间(一个索引),还是简单地说前后应该有文字? –

+2

在问题本身**中包含相关的“代码”和样本数据**。 – Amit

+0

如果您需要匹配1个字符串,请使用['^(?= \ S)(?=。* \ S $)[\ S] + $'](https://regex101.com/r/pZ0mN3/ 3)。 –

回答

2

,以配合在JavaScript正则表达式风味的开头和结尾空格的字符串,你可以使用几种选择:

  • 要求第一个与\S(= [^\s])的最后一个非空白字符。这可以用^\S[\S\s]*\S$来完成。 这个正则表达式需要至少2个字符在字符串中。自从您使用+以来,您的正则表达式在输入中需要3个字符。它不会允许一些Unicode空格。

  • 您可以使用分组与可选量词(允许0长度匹配的分组)。请参阅^\S(?:\s*\S+)*$(其中\s替代,因为它是多行演示)。开头的\S匹配非空白字符,然后是非捕获组,即*量化(匹配零次或多次出现次数)并匹配0+个空白字符的0+序列,后跟1个非空白字符。 对于像RE2这样的味道来说,这是一个很好的表达方式,它不支持lookaround,但支持量化的组。

  • 您可以使用向前看符号,要求第一个和最后一个字符为非空白字符:^(?=[\S\s]*\S$)\S[\S\s]*$其中(?=[\s\S]*\S$)需要的最后一个字符是一个非空白,并先行将要求第一个字符是后\S非空白。 [\s\S]*匹配0+任何字符。 这将匹配1个字符串,但不匹配空字符串

  • 如果你的正则表达式没有前导/尾随空格匹配字符串应该也匹配一个空字符串,使用2个负向前看符号:^(?!\s)(?![\S\s]*\s$)[\S\s]*$。如果有前导空格,(?!\s)前瞻将会使比赛失败,如果尾随空格为(?![\S\s]*\s$)[\s\S]*将匹配0+任何字符。 *如果不支持查找,请使用效率低得多的^(?:\S(?: *\S+)*)?$

如果您不需要匹配非空白字符之间的任何字符,你可以恢复[\s\S][\S ]。在PCRE中,可以使用.NET和其他支持Unicode属性的水平空格与\h匹配,可以使用[\t\p{Zs}]来匹配任何水平空格。在JS中,[^\S\r\n\f\v\u2028\u2029]可用于此目的。

注意,一些正则表达式的口味不支持非捕获组,你可以在上面的图案(全部更换(?: