如何调试这个正则表达式拼图?

时间:2017-06-28 16:16:58

标签: c# regex

我有这个测试代码:

  string triggerPoint = "<TP DDI=\"\" DQ=\"Y\" EDN=\"141040\" NE=\"141049\" NSU=\"141049\" OOH=\"141049\" QZ=\"1007\" QDN=\"141050\" QF=\"141049\" QT=\"M\" RC=\"141049\" RC2=\"\" TWE=\"141049\"/>";
        string pattern = "(?<=QZ=\").*?(?=\"\\s)";

        var match = Regex.Match(triggerPoint, pattern);

        string queueID = match.Groups[0].Value;

        Assert.AreEqual("1007", queueID);

哪个有效,但以下代码没有:

string triggerPoint = "<TP DDI=\"\" DQ=\"Y\" EDN=\"141040\" NE=\"141049\" NSU=\"141049\" OOH=\"141049\" Q=\"1007\" QDN=\"141050\" QF=\"141049\" QT=\"M\" RC=\"141049\" RC2=\"\" TWE=\"141049\"/>";
        string pattern = "(?<=Q=\").*?(?=\"\\s)";

        var match = Regex.Match(triggerPoint, pattern);

        string queueID = match.Groups[0].Value;

        Assert.AreEqual("1007", queueID);

我所做的就是从triggerPoint字符串和模式中删除QZ中的Z.但是,现在返回&#34; Y&#34;。

,而不是现在返回100的queueID

第二个片段是我实际需要工作的内容。请有人能告诉我什么错了吗?

1 个答案:

答案 0 :(得分:2)

正则表达式(您的尝试)

(?<=Q=").*?(?="\s)

匹配Q=""之间的任何内容(双引号后跟空格)。它并不关心Q之前的内容。

如果在Q之前添加字边界,它将确保在它之前没有字符(也不是数字),就像DQ="Y"的情况一样,这是你的正则表达式找到的。所以

(?<=\bQ=").*?(?="\s)

应该这样做。

See it here at regex101。 (regex101不支持 C#风格,但它比替代品更具说明性(我知道)并且RE是相同的。)

别忘了逃避必要的角色。