我想在一个句子中匹配单个字母。所以...
I want to have my turkey. May I. I 20,000-t bar-b-q
我想匹配
*I* want to have my turkey. May *I*. *I* 20,000-t bar-b-q
现在我正在使用
/\b\w\b/
作为我的正则表达式,但那是匹配的
*I* want to have my turkey. May *I*. *I* 20,000-*t* bar-*b*-*q*
有关如何超越最后一英里的任何建议吗?
答案 0 :(得分:0)
如果前一个字符是单词或连字符,或者如果下一个字符是单词a或连字符,则使用负向lookbehind和负向前瞻失败:
/(?<![\w\-])\w(?![\w\-])/
示例:http://www.rubular.com/r/9upmgfG9u4
请注意,正如rtcherry所提到的,这也将匹配单个数字。为防止出现这种情况,您可能需要将字符类之外的\w
更改为[a-zA-Z]
。
答案 1 :(得分:0)
/(?<![0-9a-zA-Z\-])[a-zA-Z](?![0-9a-zA-Z\-])/
这也会避免像This -> 1a <- is not a single letter. Neither is -> 2 <- that.
答案 2 :(得分:0)
你问的是正则表达式太多了。 \w
匹配单词字符,其中包括大写和小写字母,十位数和下划线。所以它与[0-9A-Z_a-z]
相同。
\b
匹配(零宽度)边界,其中 word 字符旁边没有另一个 word 字符,例如在开头或字符串的结尾,或一些标点符号或空格旁边。
使用负面观察和预测,这相当于\b\w\b
相当于
(?<!\w)\w(?!\w)
即。 单词字符,在其之前或之后没有其他单词字符。
如您所见,它会在t
中找到b
,q
和20,000-t bar-b-q
。因此,在你的法庭上,通过“句子中的单个字母”来定义你真正意味着什么。
它几乎可以说“任何不在可打印字符之前或之后的字母,这是
/(?<!\S)[A-Za-z](?!\S)/
但是在I
中遗漏了May I.
,因为它后面有一个点。
那么,你的意思是一个没有可打印字符的单个字母,后跟空格,一个点或字符串的结尾(或者是一个逗号,分号或冒号) ?那你想要
/(?<!\S)[A-Za-z](?=(?:[\s.,;:]|\z))/
在字符串中找到三个I
个字符。
我希望有所帮助。
答案 3 :(得分:0)
只要我们挑剔,非ASCII字母很容易包含在内:
/(?<![[:alnum:]-])[[:alpha:]](?![[:alnum:]-])/
这样可以避免匹配'Cómorestú'中的t
请注意,如果它是字符类中的最后一个字符(我不确定这在技术上是什么),则无需转义-
。