使用正则表达式匹配句子中的单个字母

时间:2013-05-14 22:44:04

标签: ruby regex

我想在一个句子中匹配单个字母。所以...

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*

有关如何超越最后一英里的任何建议吗?

4 个答案:

答案 0 :(得分:0)

如果前一个字符是单词或连字符,或者如果下一个字符是单词a或连字符,则使用负向lookbehind和负向前瞻失败:

/(?<![\w\-])\w(?![\w\-])/

示例:http://www.rubular.com/r/9upmgfG9u4

请注意,正如rtcherry所提到的,这也将匹配单个数字。为防止出现这种情况,您可能需要将字符类之外的\w更改为[a-zA-Z]

答案 1 :(得分:0)

F.J的答案还包括数字。这仅限于ASCII字符,但您确实需要定义哪些字符可以并排计数为单个字母。

/(?<![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中找到bq20,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

请注意,如果它是字符类中的最后一个字符(我不确定这在技术上是什么),则无需转义-