我有一个正则表达式
Regex r = new Regex(@"(\s*)([A|B|C|E|G|H|J|K|L|M|N|P|R|S|T|V|Y|X]\d(?!.*[DFIOQU])(?:[A-Z](\s?)\d[A-Z]\d))(\s*)",RegexOptions.IgnoreCase);
并且有一个字符串
string test="LJHLJHL HJGJKDGKJ JGJK C1C 1C1 LKJLKJ";
我必须取C1C 1C1。这样运行正常。 但是如果修改测试字符串为
string test="LJHLJHL HJGJKDGKJ JGJK C1C 1C1 ON";
然后它无法找到模式,即C1C 1C1。
知道为什么这个表达式失败了吗?
答案 0 :(得分:3)
你有一个消极的期待:
(?!.*[DFIOQU])
匹配“ON”中的“O”,因为它是一个负面的前瞻,整个模式失败。而且,顺便说一句,我认为你想要取代它:
[A|B|C|E|G|H|J|K|L|M|N|P|R|S|T|V|Y|X]
有了这个:
[A-CEGHJ-NPR-TVYX]
管道(|
)是字符类中的文字字符,而不是替换字符,您可以使用范围来帮助显示您要忽略的字符。
单个正则表达式可能不是解析该字符串的最佳方法。或许你只需要一个更宽松的正则表达式。
答案 1 :(得分:1)
您正在寻找一个不是DFIOQU
的关注您的负面展望(?!.*[DFIOQU])
在您的第二个字符串中,O
末尾有一个ON
,因此必须无法匹配。
如果你在前面的负面展示中移除.*
,它只会检查直接跟随的字符而不是结尾的完整字符串(这是你想要的吗?)。
\s*([ABCEGHJKLMNPRSTVYX]\d(?![DFIOQU])(?:[A-Z]\s?\d[A-Z]\d))\s*
然后它可以工作,看到它here on Regexr。现在正在检查数字后面是否有一个字符,我不知道这是不是意图。
顺便说一下。我从第一个字符类中删除了|
,不需要它,还有一些括号围绕你的空格,也不需要。
答案 2 :(得分:1)
据我了解,您需要在字符串中找到C1C 1C1文本 我用这个正则表达式做了这个
string strRegex = @"^.*(?<c1c>C1C)\s*(?<c1c2>1C1).*$";
之后,您可以从命名组中提取文本
string strRegex = @"^.*(?<c1c>C1C)\s*(?<c1c2>1C1).*$";
RegexOptions myRegexOptions = RegexOptions.Multiline;
Regex myRegex = new Regex(strRegex, myRegexOptions);
string strTargetString = @"LJHLJHL HJGJKDGKJ JGJK C1C 1C1 LKJLKJ";
string secondStr = "LJHLJHL HJGJKDGKJ JGJK C1C 1C1 ON";
Match match = myRegex.Match(strTargetString);
string c1c = match.Groups["c1c"].Value;
string c1c2 = match.Groups["c1c2"].Value;
Console.WriteLine(c1c + " " +c1c2);