【问题标题】:.Net Regular Expression to get parenthetical text at end of <p> tags.Net 正则表达式在 <p> 标签末尾获取括号文本
【发布时间】:2010-04-08 21:30:06
【问题描述】:

我尝试匹配一个简单的模式,即在 HTML 段落末尾的括号之间捕获的任何字符。每当该段中有额外的括号时,我都会遇到麻烦:

如果输入字符串是“..... (321)

”我想得到值 (321)

但是,如果段落中有这样的文本:“... (123) (321)

” 我的正则表达式正在返回 "(123) (321)" (开头的 "(" 和结尾的 ")" 之间的所有内容

我正在使用正则表达式模式“\s(.+)

如何获取正确的值(使用 VB.NET)

这就是我目前正在做的事情:

    Dim reg As New Regex("\s\(.+\)</P>", RegexOptions.IgnoreCase)
    Dim matchC As MatchCollection = reg.Matches(su.Question)
    If matchC.Count > 0 Then
        Dim lastMatch As Match = matchC(matchC.Count - 1)
        Dim DesiredValue As String = lastMatch.Value
    End If

【问题讨论】:

标签: .net wpf regex vb.net


【解决方案1】:

只需将表达式更改为非贪婪并反转匹配顺序即可:

Dim reg As New Regex("\s\(.+?\)</P>", RegexOptions.IgnoreCase Or RegexOptions.RightToLeft)

或者让它只匹配一个右括号:

"\s\([^)]+\)</P>"

或者让它只匹配你胸腔内的数字:

"\s\(\d+\)</P>"

编辑:为了使非贪婪样本工作,您需要在 Regex 对象上设置 RightToLeft 标志

【讨论】:

  • 我进行了更改,但通过文本解析:“....(123) (321)” 仍然返回“(123) (321)”
  • .. 我只希望它返回“(321)”
  • 再次检查我的建议,我编辑了一点。非贪婪方法仍然有效,但需要在 RegexOptions 上添加一个额外的标志。
【解决方案2】:
Dim reg As New Regex("\s\(\d+\)</P>", RegexOptions.IgnoreCase)

你的绊脚石是. 的特异性不足(它匹配所有字符,包括括号)和+ 的贪婪(它尽可能匹配)。

只要更具体 (\d+) 或不那么贪婪 (.+?)。

【讨论】:

  • “不那么贪婪”不起作用; RE 引擎总是尝试尽快开始匹配。更具体是正确的方法。
  • 我刚刚用非贪婪的建议编辑了我的答案,它确实有效,但你必须将正则表达式引擎设置为向后工作(.NET 上的 RegexOptions.RightToLeft 会这样做)跨度>
【解决方案3】:

您需要使用 Look Ahead (?= ) 来锚定模式。这为解析器提供了数据应该停止、锚定到的位置的提示。这是一个从 p 标签锚点获取前一个 ( ) 数据的示例:

(?:\()([^)]+)(?:\))(?=</[pP]>)


(?:\()        - Match but don't capture a (
([^)]+)       - Get all the data until a ) is hit. [^ ] is the not set
(?:\))        - Match but don't capture the )  
(?=</[pP]>)  - Look Ahead Match but don't capture a suffix of </p or P >

HTH

【讨论】:

    猜你喜欢
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 2012-06-16
    相关资源
    最近更新 更多