匹配单个字符但不是多个

时间:2018-05-16 19:57:15

标签: javascript regex

我有一个像这样的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

提前谢谢!

3 个答案:

答案 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组:

^(x*)(x[^x]+x)(\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