【问题标题】:Convert PHP Regex to .NET将 PHP 正则表达式转换为 .NET
【发布时间】:2015-08-21 18:14:08
【问题描述】:

.NET Regex 中的等价物是什么

preg_replace("/\(([^()]*+|(?R))*\)/","", $string);

我总是在使用正则表达式时遇到困难,我尝试在 myregextester.com 上正确使用它,但我无法正确使用语法,所以它变成了这个..

1.0 (Mac OS X Mail 9.0 \(3083\))

进入

1.0

我想去掉 cmets(即使是嵌套的)

我正在使用它,但它不适用于嵌套的 cmets。

 Dim regex As New Regex(String.Format("\{0}.*?\{1}", "(", "("))
 Return regex.Replace(s, String.Empty)

【问题讨论】:

  • 对不起,你为什么不直接使用这个:\s*\(.*\)
  • 你想匹配平衡括号吗?
  • 匹配嵌套结构 in Friedl's book p436: \((?>[^()]+|\((?<DEPTH>)|\)(?<-DEPTH>))*(?(DEPTH)(?!))\)
  • IISMathwizard 向导解决方案似乎可以满足我的需求 - 非常感谢。

标签: .net regex vb.net


【解决方案1】:

正在考虑的正则表达式是匹配平衡括号的 PCRE 正则表达式。要匹配 .NET 中的平衡括号,您可以使用 this regex:

\((?>(?:[^()])+|\((?<DEPTH>)|\)(?<-DEPTH>))*(?(DEPTH)(?!))\)

VB.NET 实现:

Dim R As Regex = New Regex(" \(                   " & _
                       "   (?>                " & _
                       "       [^()]+         " & _
                       "     |                " & _
                       "       \( (?<DEPTH>)  " & _
                       "     |                " & _
                       "       \) (?<-DEPTH>) " & _
                       "   )*                 " & _
                       "   (?(DEPTH)(?!))     " & _
                       " \)                   ", _
   RegexOptions.IgnorePatternWhitespace)
Dim str As String = R.Replace("1.0 (Mac OS X Mail 9.0 \(3083\))", "")

IDEONE demo

要删除空格,只需在模式开头添加[ ]*\s*

如果您只想删除最左边和最右边圆括号之间的所有字符,请使用贪婪匹配:

(?s)[ ]*\(.*\)

或者

(?s)\p{Zs}*\(.*\)

demo

\p{Zs} Unicode 类别类匹配任何 Unicode 空间,而 [ ] 匹配常规文字空间。请注意,\s 匹配所有可能的空格,包括换行符。

【讨论】:

  • 我测试了 "\s*(.*)" 和 "(?s)[ ]*(.*)" 它们的行为都是一样的,在我的测试中,你能提供一个样本,其中结果会有所不同。
  • 例如\s 可以匹配换行符,[ ] 不能。
  • 是的,我现在可以看到,"(?s)[ ]*(.*)" 是我正在寻找的,在这种情况下我有 - 我不认为一条线休息是可能的,但如果是的话。感谢您的教育。
  • 您可以在 MSDN 上阅读更多关于 what \s matches 的信息。简而言之,它匹配\f(换页符)、\n(换行符)、\r(回车符)、\t(制表符)、\v(垂直制表符)、@ 987654344@(省略号或下一行 (NEL) 字符 (...))、\p{Z}(匹配任何分隔符)。最后的那些可以在unicode.orgfileformat.info 进行检查。
猜你喜欢
  • 1970-01-01
  • 2016-04-02
  • 2013-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多