【问题标题】:regex word boundary excluding the hyphen正则表达式单词边界不包括连字符
【发布时间】:2012-04-29 02:26:04
【问题描述】:

我需要一个匹配以单词边界结尾的表达式的正则表达式,但它不将连字符视为边界。 即获取匹配的所有表达式

type ([a-z])\b

但不匹配,例如

type a-1

换种说法:我想要一个等效的单词边界运算符 \b,它不使用单词字符类 [A-Za-z0-9_],而是使用扩展类:[A-Za-z0-9_-]

【问题讨论】:

  • 您使用的是什么正则表达式引擎——这是 .NET、javascript 等吗?

标签: regex


【解决方案1】:

您可以为此使用前瞻,最短的方法是使用负前瞻:

type ([a-z])(?![\w-])

(?![\w-]) 的意思是“如果下一个字符在 \w- 中,则匹配失败”。

这是一个使用普通前瞻的选项:

type ([a-z])(?=[^\w-]|$)

您可以将(?=[^\w-]|$) 解读为“仅当字符类[\w-] 中的下一个字符,或者这是字符串的结尾时才匹配”。

看到它的工作:http://www.rubular.com/r/NHYhv72znm

【讨论】:

  • 如果您还想匹配空格而不是单词的结尾或开头,则必须在美元周围添加括号,即 ([az])(?![\w-] )|($|\s)。就我而言,我想从 8 位数字的开头和结尾的单词边界中排除连字符。正则表达式看起来像 re.search(r"((?![-\w])|(\s|^))(\d{8})((?![-\w])|(\s |^))", "-12345678 ")
【解决方案2】:

我有一个非常相似的问题,只是我不想将“*”视为边界字符。这是我所做的:

\b(?<!\*)([^\s\*]+)\b(?!*)

基本上,如果您处于单词边界,请回看一个字符,如果前一个字符是“*”,则不匹配。如果你在中间,不要在空格或星号上匹配。如果您在末尾,请确保末尾不是星号。在你的情况下,我认为你可以使用 \w 而不是 \s。对我来说,这适用于以下情况:

*word
wo*rd
word*

【讨论】:

  • 您的正则表达式语法无效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
相关资源
最近更新 更多