我有这个测试代码:
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第二个片段是我实际需要工作的内容。请有人能告诉我什么错了吗?
答案 0 :(得分:2)
正则表达式(您的尝试)
(?<=Q=").*?(?="\s)
匹配Q="
和"
之间的任何内容(双引号后跟空格)。它并不关心Q
之前的内容。
如果在Q
之前添加字边界,它将确保在它之前没有字符(也不是数字),就像DQ="Y"
的情况一样,这是你的正则表达式找到的。所以
(?<=\bQ=").*?(?="\s)
应该这样做。
See it here at regex101。 (regex101不支持 C#风格,但它比替代品更具说明性(我知道)并且RE是相同的。)
别忘了逃避必要的角色。