【问题标题】:Match words with no hyphen inside匹配里面没有连字符的单词
【发布时间】:2013-07-10 20:16:22
【问题描述】:

我需要一个允许其中没有连字符的单词的正则表达式。 例如,在字符串“non-word sentence”中,它应该只匹配“sentence”。 我写道:

 "\b(?!\w+[-]\w+)\w+" 

它失败了:

它不仅匹配“句子”,还匹配“单词”。

如何让它忽略里面有连字符的单词?

【问题讨论】:

  • 您使用的是哪个正则表达式引擎?聚合酶链反应?正如您的标签所述,这是针对 C++ 程序的吗?
  • 要添加到@JesseSmith 的评论中,我也很好奇您使用的是哪个引擎,因为 AFAIK,没有 C++ 标准库有工作正则表达式(我可能是错的,在这种情况下我d很高兴得到纠正)。 C++11 核心语言现在几乎可以工作,但标准库却落后了......
  • @syam:C++ 从 C++11 开始支持正则表达式,例如en.cppreference.com/w/cpp/regex
  • @NateKohl: C++11 specification 支持正则表达式,但是 syam 是正确的,没有 C++ 实现 有工作正则表达式。
  • @MooingDuck:LLVM 的 libc++ (libcxx.llvm.org) 目前对 有合理的支持。

标签: c++ regex


【解决方案1】:

好的,这是 PCRE(Perl 兼容的正则表达式系统,这意味着它们中的大多数):

(?<![-])\b[a-zA-Z]+\b(?![-])

让我为你分解一下:

(?&lt;![-]): Negative look-behind -- “下一个匹配的东西,看它前面的东西。如果是连字符,忽略这个匹配”

\b[a-zA-Z]+\b:一个词的边界,一个词,一个词的边界。我们的“东西”。

(?![-]):否定的前瞻——“匹配的东西,看它后面的东西。如果是连字符,忽略这个匹配”

Here it is 在我最喜欢的在线正则表达式测试器 RegExr 中。

【讨论】:

  • 嘿,杰西,后视 + 事物 + 前瞻真的很聪明。非常感谢!
  • 如果它解决了你的问题,你能接受这个问题吗?这将帮助未来遇到同样问题的人。
【解决方案2】:

这对你有用吗:

(?<=[^\s])[a-zA-Z]*(?=[$\s])

【讨论】:

  • @Jesse Smith,我看你是对的,你知道为什么,我认为 (?
  • [^\s] 将匹配任何非空格。所以一个积极的后视断言是说“我当前的位置之前是否有任何不是空白的东西?”这不是我们要问的。我们在问“我当前的位置之前没有连字符吗?”
  • 我刚刚注意到你的前瞻:$ 在字符类的上下文中意味着其他东西,即普通的旧“$”。您要使用字符串结尾分隔符吗?与字符类中的 ^ 相同。除了它是特殊的——它意味着否定。 [^x] 表示文字字母“x”以外的任何内容。 \s 也一样。我相信 [^\s] 在逻辑上等同于 \S
  • 啊,谢谢你的澄清,那是我的错,我会删除这个答案,因为它是完全错误的。也是的,我正在寻找字符串或空格的开始/结束。
  • 一切都很好:断言和一般的正则表达式都是非常棘手的野兽。至少我们都学到了一些东西! :)
最近更新 更多