-1

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

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

4 回答 4

0

只要我们很挑剔,非 ASCII 字母很容易包含:

/(?<![[:alnum:]-])[[:alpha:]](?![[:alnum:]-])/ 

这将避免匹配t'Cómo eres tú'

请注意,当它是字符类中的最后一个字符时,没有必要对其进行转义-(我不确定这在技术上是否如此)。

于 2013-05-15T00:48:38.180 回答
0

您对正则表达式的要求太多了。\w匹配一个单词字符,包括大小写字母、十位数字和下划线。所以它是一样的[0-9A-Z_a-z]

\b匹配(零宽度)边界,其中单词字符旁边没有另一个单词字符,例如在字符串的开头或结尾,或者在某些标点符号或空格旁边。

使用消极的后视和前瞻,这\b\w\b相当于

(?<!\w)\w(?!\w)

即在它之前或之后没有另一个单词字符的单词字符。

正如您所发现的那样,t在中找到b和。因此,您需要重新定义“句子中的单个字母”的真正含义q20,000-t bar-b-q

它几乎可以说“任何前面或后面没有可打印字符的字母,

/(?<!\S)[A-Za-z](?!\S)/

但这遗漏了IMay I.因为它后面有一个点。

那么,您是指一个前面没有可打印字符,后面跟空格、点或字符串结尾(或逗号、分号或冒号)的单个字母吗?那你想要

/(?<!\S)[A-Za-z](?=(?:[\s.,;:]|\z))/

它在您的字符串中恰好找到三个I字符。

我希望这会有所帮助。

于 2013-05-15T00:44:16.553 回答
0

如果前一个字符是单词或连字符,或者如果下一个字符是单词 a 或连字符,则使用否定的lookbehind 和否定的lookahead 会失败:

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

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

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

于 2013-05-14T22:47:19.007 回答
0

FJ 的回答也会包括数字。这仅限于 ASCII 字符,但您确实需要定义哪些字符可以并排并仍算作单个字母。

/(?<![0-9a-zA-Z\-])[a-zA-Z](?![0-9a-zA-Z\-])/

这也将避免类似的事情This -> 1a <- is not a single letter. Neither is -> 2 <- that.

于 2013-05-14T22:47:41.250 回答