【问题标题】:Regex: Lookahead and then lookbehind from the lookahead position正则表达式:先行,然后从先行位置向后看
【发布时间】:2016-09-14 22:56:26
【问题描述】:

我有一个 .net 正则表达式(我必须使用正则表达式),它目前通过简单地匹配捕获组(捕获测试以传递给方法)之间的任何非单词字符来工作。

在大多数情况下它可以正常工作,但在要传递给方法的文本是负数的情况下,非单词匹配会消耗减号并将正数传递给方法。更复杂的是,捕获组之间的非单词字符可能包含像“ - ”这样的文本,应该被使用。文本也可能是货币值,如“$200”,在这种情况下,“$”也应该被消耗掉。

我尝试使用非单词字符,直到一个数字后面跟着一个数字,然后检查该数字之前是否有除减号以外的其他内容,如果是,则仅使用。我的正则表达式是:

\W+(?!\d(?<![^-]))

但是这似乎不像我预期的那样工作,因为这似乎仍然消耗我的减号,导致一个正数被传递给我的方法。

我的正则表达式错了吗?或者我可以不向前看,然后从向前看的位置向后看?

我怎样才能得到想要的结果,即这个文本:

" -100"

仅匹配开头的空格。还有这段文字:

" $200"

匹配空格和 $ 符号。

还有这段文字:

" - 100" 

匹配空格、减号和后面的空格,但不匹配数字。

可以找到一个例子here

【问题讨论】:

  • 看起来您可能会使用\W+(?!(?&lt;![^-])\d) 或更好的 - \W+(?!(?&lt;=-)\d)

标签: .net regex


【解决方案1】:

看来你可以用

\W+(?!(?<=-)\d)

regexstorm demo

模式说明

  • \W+ - 1+ 个非单词字符
  • (?!(?&lt;=-)\d) - 如果 1+ 个非单词字符后跟一个数字 \d 前面有一个 - ((?&lt;=-)),则匹配失败的否定前瞻 ((?&lt;=-))

【讨论】:

  • 是的,这似乎有效,谢谢。只是把我的后视顺序弄错了!
  • 这不仅仅是一个订单。 \W+(?!\d(?&lt;![^-])) 匹配 1+ 个非单词字符,这些字符后面不跟不应是非连字符的数字。由于向后看,向前看将始终返回 true,因为数字不是连字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-07
  • 1970-01-01
相关资源
最近更新 更多