.Net正则表达式 - 积极前瞻不起作用

时间:2016-01-18 09:44:20

标签: .net regex outlook lookahead

我有一个正则表达式(.Net - System.Text.RegularExpressions),用于匹配“()”中的任何内容,并且它必须包含至少一个数字,一个字母和一个正斜杠“/”。这是我到目前为止所提出的:

(((?=[^\s]*[0-9])(?=[^\s]*[a-zA-Z])(?=[^\s]*[/])))\([0-9a-zA-Z"£$%^&*([\]_+=\-–`{}:@~#';<>?/.,|\\]+\)

在测试中(在Outlook 2010 addin,.Net 4.0中使用),这似乎工作正常,并且会正确匹配/不匹配以下内容:

应匹配: - (TYR / 12/2),(KEN1 / 1),(KJC / 8430-3&amp; 4 / Greenfield),

不应该匹配: - (2 pm-5pm),(HempsonsLive.18295415.v0.1),(HOW121.3)

但是,在生产环境(也是Outlook 2010)中进行测试时,根据以下内容错误地匹配字符串:

(@name="beausdfdmp_prod")
(@name="plosdfgms04")
(@name="boonapbfms03")
(@name="plonapbfms01")
(@name="bfff_pl_server5")

我还不能在开发中重现这些匹配,所以不知道为什么在生产中它匹配它们。如果客户端生产环境运行.Net 3.5或更低版本,这会对正则表达式产生影响吗?

关于可能导致此问题的任何其他想法?

2 个答案:

答案 0 :(得分:2)

在前瞻中,我宁愿exclude关闭 div { min-height:300px; border-left: 1px solid black; }而不是使用)

怎么样?
[^\s]*

开幕后\((?=[^)\d]*\d)(?=[^)\/]*\/)[^)]*?[a-zA-Z][^)]*\)

  • \( look ahead一位数
  • (?=[^)\d]*\d)展望一个正斜杠
  • (?=[^)\/]*\/)[^)]*?[a-zA-Z][^)]*包含至少一个字母,直到文字结束)
    如果不允许空格,请改用\)

See demo at regex101

答案 1 :(得分:0)

尝试使模式不那么模糊和冗长。

如果您打算匹配至少应包含数字,字母和正斜杠的括号字符串,您可以使用

\((?=[^()\p{L}]*\p{L})(?=[^()\d]*\d)(?=[^()/]*/)[^()]*\)

请参阅regex demo

正则表达式匹配:

  • \( - 打开圆括号
  • (?=[^()\p{L}]*\p{L}) - 括号内必须有一个字母
  • (?=[^()\d]*\d) - ()
  • 中必须有一位数字
  • (?=[^()/]*/) - ()
  • 内必须有斜杠
  • [^()]* - 除()以外的零个或多个符号
  • \) - 关闭)

如果使用非.NET正则表达式引擎处理正则表达式,您可能希望将其更改为:

[(](?=[^()A-Za-z]*[A-Za-z])(?=[^()0-9]*[0-9])(?=[^()/]*/)[^()]*[)]

another demo。此正则表达式没有转义,在您的情况下可能也是一个问题,\p{L}将替换为ASCII字母[a-zA-Z]