当前位置: 首页 > 知识库问答 >
问题:

正则表达式不匹配连字符和其他标点符号

韦晟睿
2023-03-14

为什么下面的正则表达式不匹配连字符(或与号、句号或逗号,尽管我暂时将它们排除在下面的字符类之外)?我在试着匹配字符串...

h eh - l ow 1

...(这是单词“hello”的语音表示),并且当字符串中有连字符时,匹配失败(上面列出的与数等相同)。

Regex.Match(SomeText, "^(\b(?:aa|ae|ah|ao|aw|ax|ay|b|ch|d|dh|eh|er|ey|f|g|h|ih|iy|jh|k|l|m|n|ng|ow|oy|p|r|s|sh|t|th|uh|uw|v|w|y|z|zh|[12\-])\b ?)+$", RegexOptions.IgnoreCase).Success

这种模式...

^(\b(?:a|b|-)\b ?)+$

...起作用,根据regex101.com的说法,它本质上是完全相同的模式,所以我不明白为什么更长的模式不起作用。

共有1个答案

殳自怡
2023-03-14

是你对单词界限的理解出了问题。但不要感觉不好,这是最被误解的正则表达式构造之一。您需要知道regex引擎不知道单词是什么,正如我们定义的那样。对它来说,单词只是一个或多个单词字符的序列(即与\w匹配的字符)。

但是无论您如何定义它们,一个正则表达式并不真正匹配单词。它只能在任何给定的时间“看到”两个字符:下一个字符和上一个字符。\b匹配的是后面跟一个单词字符但前面没有一个(可能是单词的开头),或者前面跟一个单词字符但后面没有一个(可能是单词的结尾)的位置。

您可以像zx81那样通过策略分组来使正则表达式工作,但最好是去掉单词边界。它们的目的是确保你匹配的单词不是一个较长单词的一部分。您不需要它们,因为这一点从上下文中已经很清楚了:每个单词(1)前面有空格或字符串的开头,(2)后面有空格或字符串的结尾。

"(?in)^((aa|ae|ah|ao|aw|ax|ay|b|ch|d|dh|eh|er|ey|f|g|h|ih|iy|jh|k|l|m|n|ng|ow|oy|p|r|s|sh|t|th|uh|uw|v|w|y|z|zh|[12]|-)( |$))+$"

如果您想知道,(?In)中的n将打开ExplicitCapture模式,使组不被捕获。(参考)

 类似资料:
  • 问题内容: 我在用Python将字符串中的数字匹配时遇到麻烦。尽管应该明确匹配,但甚至不匹配 或仅匹配。我的监督在哪里? 问题答案: 阅读文档:http : //docs.python.org/2/library/re.html#re.match 如果在零个或多个字符 开头 的 字符串 您要使用(或)

  • 我正在努力提高我的正则表达式技能。我做不了这个练习。 https://alf.nu/RegexGolf 您必须匹配没有连续相同字符的单词。为了清楚起见,我们应该避免像abba、baab、czzc这样的模式。 我看到的唯一方法是使用捕获组: 然后进行负面展望: 但在网站上,它不工作,因为它不匹配任何东西。 有什么建议吗?谢谢

  • 我正在尝试匹配以下正则表达式: 换句话说,一个单词边界后跟上面的任何字符串(可选地跟一个句点字符),后面跟一个单词边界。 我也在regex101上尝试过这一操作,但与数仍然不匹配:https://regex101.com/r/klkmwl/1 转义符并没有什么区别,我已经尝试使用十六进制转义序列来代替和符(如本问题所建议的)。为什么这不匹配?

  • 问题内容: 我在尝试将我的javascript regex经验转移到Python时遇到了麻烦。 我只是想让它工作: …但是它打印无。如果我做: 它匹配…默认情况下是否匹配字符串的开头?当匹配时,如何使用结果? 我如何进行第一场比赛?是否有比python网站提供的文档更好的文档? 问题答案: 隐式添加到您的正则表达式的开头。换句话说,它仅在字符串的开头匹配。 将在所有位置重试。 一般来说,建议您在需

  • 我试图创建一个unicode正则表达式,它匹配每个字符,除了一个字母(任何语言的)和标点符号。 比如字符串 abcd 123 kjd·%/(“?:!”! 应该只匹配下面的粗体部分 abcd 123 kjd·%/(“?:!”! 我知道匹配除字母之外的所有内容,匹配除标点符号之外的所有内容。我如何将这两个正则表达式字符串组合为一个?我已经尝试过简单地将放在一起,但这并没有给出所需的匹配。我也尝试过编写

  • 问题内容: 我列出了大约12万个英语单词(基本上是该语言中的每个单词)。 我需要一个正则表达式,允许使用通配符aka 和来搜索这些单词。 一些例子: 如果用户搜索,它会匹配,例如或或。 如果用户搜索(以结尾的任何单词),则它将匹配或或或。 现在,大多数用户(尤其是对正则表达式不熟悉的用户)都知道,该用户只能替换1个字符,而可以替换0、1个或多个字符。我绝对想基于此构建我的搜索功能。 我的问题是:如