我有一个像这样的RegExp:
/(?!xx)x.+?(?!xx)x/g
我测试了三个示例字符串。我用^
标记了预期的匹配。
应匹配0-5
:
x...x
^^^^^
不匹配
xx...xx
应匹配2-7
:
xxx...xxx
^^^^^
应匹配3-8
:
xxxx...xxxx
^^^^^
我没有找到匹配x
而没有匹配xx
的方法,但我的想法已经用完了。请帮我。
这是当前的结果:https://regex101.com/r/OqSMuO/5
提前谢谢!
答案 0 :(得分:1)
我认为这符合您的意图。
^(?:(x[^x]{3}x)|x{2,}(x[^x]{3}x)x{2,})$
它分为两部分,OR' d:
(x[^x]{3}x)
符合x...x
和x{2,}(x[^x]{3}x)x{2,}
匹配xxx...xxx
但不匹配xx...xx
注意:这对于不平衡的匹配没有帮助。例如。例如(xxx...xxxx)
仍然匹配正则表达式。但是,据我所知,只用正则表达式就无法解决这个问题。你需要一个堆栈才能这样做。
答案 1 :(得分:0)
如果前导次数x应与尾随次数相同,则可以使用backreference来捕获第1组:
从字符串^
的开头,在组1中捕获零{或1}}次。然后使用否定字符类在第2组中捕获x
,一次或多次捕获x
后跟x x
。该群组将包含您的匹配。
最后使用反向引用(x[^x]+x)
再次匹配组1中的反向引用并断言字符串\1
的结尾。
$

答案 2 :(得分:0)
除了以两个&#34; xx&#34;开头的那个之外,它捕获每个reactionInfo = new Dictionary<string, List<string>>();
string line;
using (var reader = new StreamReader(filePath))
{
var lastKey= "";
while ((line = reader.ReadLine()) != null)
{
if (line.Trim().StartsWith("'"))
{
if(!reactionInfo.ContainsKey(line))
{
reactionInfo.Add(line, new List<string>());
lastKey = line;
}
}else
{
reactionInfo[lastKey].AddRange(line.Split(' ').ToList());
}
}
}
。 (x...x
)。
xx...xx