VB Net 正则表达式模式不匹配,但在正则表达式网站中测试良好

VB Net Regex pattern not matching, but tested in regex website fine

提问人:pg_ 提问时间:7/8/2023 最后编辑:pg_ 更新时间:7/8/2023 访问量:59

问:

我有一个很长的字符串,我正在尝试查找匹配项,如下所示。“uppercaseLine”表示要搜索的字符串。它的内容并不重要,因为我已将相同的字符串和相同的正则表达式模式放入各种测试站点并确认它确实找到了匹配项。显然,在测试之前,我从字符串中删除了双引号。但是,无论如何,这总是在我的程序中返回 0 个匹配项。

Dim pattern = "(\bFROM\b|\bJOIN\b)\s+""([^""]+)"""
Dim viewMatches As System.Text.RegularExpressions.MatchCollection = System.Text.RegularExpressions.Regex.Matches(uppercaseLine, pattern)
MsgBox(viewMatches.Count)

我也试过了

Dim rx As New Regex("(\bFROM\b|\bJOIN\b)\s+""([^""]+)""")
Dim matches As MatchCollection = rx.Matches(uppercaseLine)

但计数仍然始终为零。我正在搜索的长字符串的片段如下:

"JOB_HEADER" ."SHIPD_FLG" FROM "JOB_HEADER" "JOB_HEADER"  JOB

...您可以看到应返回匹配项的 FROM“JOB_HEADER”。

当我执行以下操作时,解析出我正在搜索的文本片段,它确实找到了它。我用过“”和\u0022。我不明白,因为我从不起作用的同一来源中提取测试字符串。

    Dim rx As New Regex("(\bFROM\b|\bJOIN\b)\s+\u0022([^\u0022]+)\u0022", RegexOptions.IgnoreCase)
    Dim teststring = "JOB_HEADER"" .""SHIPD_FLG"" FROM ""JOB_HEADER"" ""JOB_HEADER"" JOB"
    Dim matcho As MatchCollection = rx.Matches(teststring)

我正在搜索的完整字符串的图像

正则表达式 vb.net

评论

0赞 Jimi 7/8/2023
将双引号替换为,例如: - 转义引号也应该有效,不确定 VB.NET\u0022
0赞 pg_ 7/8/2023
谢谢@Jimi,不幸的是我确实尝试过,但没有帮助。我想我正在比较的字符串是问题所在,但我很难确定原因。当我只解析出应该匹配的位时,它就可以工作了。

答:

0赞 dbasnett 7/8/2023 #1

我讨厌字符串中的引号,所以我这样做,

    Dim patt As XElement = <t><![CDATA[(\bFROM\b|\bJOIN\b)\s+"([^"]+)]]></t>
    Dim rx As New System.Text.RegularExpressions.Regex(patt.Value, System.Text.RegularExpressions.RegexOptions.Compiled)
    Dim test As XElement = <t><![CDATA["JOB_HEADER" ."SHIPD_FLG" FROM "JOB_HEADER" "JOB_HEADER" JOB ...to which you can see the FROM "JOB_HEADER" from]]></t>
    Dim matches As System.Text.RegularExpressions.MatchCollection = rx.Matches(test.Value)
    Debug.WriteLine(patt.Value)
    Debug.WriteLine(test.Value)
    Debug.WriteLine(matches.Count)
    For Each m As System.Text.RegularExpressions.Match In matches
        Debug.WriteLine(m.Index)
    Next

希望我得到了正确的模式。它确实在测试字符串中找到了两个匹配项。cdata 的一般形式是

<![CDATA[content]]> 

调试:

(\bFROM\b|\bJOIN\b)\s+"([^"]+)

"JOB_HEADER" ."SHIPD_FLG" FROM "JOB_HEADER" "JOB_HEADER" JOB ...to which you can see the FROM "JOB_HEADER" from

2
26
89

评论

0赞 pg_ 7/8/2023
谢谢@dbasnett,即使使用引号或转义字符,我也不会遇到与该示例字符串匹配的问题。主要问题是当我尝试搜索我正在使用的较大字符串时,其中包含该示例字符串。我想绳子(也许是大小)有什么东西破坏了它?请参阅我添加的我正在搜索的查询的图像。它就像 19k 个字符长,所以我不知道如何将其包含在这篇文章中。
0赞 dbasnett 7/8/2023
@PhillipGrekstas - 如果您使用我的代码但搜索该字符串,则找不到匹配项?该字符串不是那么长。
0赞 pg_ 7/8/2023
当我使用您的代码并搜索该字符串时,我确实找到了匹配项。莫名其妙的是,它找到了 5 个匹配项,并返回了奇怪的索引。但是,在我提供的示例字符串中查找匹配项时,我从来没有遇到过任何问题。运行代码的调试: (\bFROM\b|\bJOIN\b)\s+“([^”]+)“ ”JOB_HEADER“ .”SHIPD_FLG“从”JOB_HEADER“”JOB_HEADER“约伯记 5 173 294 1661 1687 1750
0赞 pg_ 7/8/2023
我将如何将变量传递给这一行而不是静态字符串。我是XML和CDATA调暗测试的新手,因为XElement = <t><![CDATA[“JOB_HEADER”.”SHIPD_FLG“来自”JOB_HEADER“”JOB_HEADER“工作......您可以看到 FROM “JOB_HEADER” from]]></t>
0赞 pg_ 7/8/2023
我能够用以下方法找出我的最后一条评论: Dim test As New XElement(“title”, New XCData(reader.GetString(0))) 问题最终出在源字符串中的引号上。当我手动输入双引号时,一切都在工作。VB Net 很奇怪。但是您的 XElement 和 CDATA 示例运行得非常好。非常感谢