首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >匹配单个字符,但不匹配多个字符

匹配单个字符,但不匹配多个字符
EN

Stack Overflow用户
提问于 2018-05-17 03:57:15
回答 3查看 93关注 0票数 0

我有一个这样的RegExp:

代码语言:javascript
运行
复制
/(?!xx)x.+?(?!xx)x/g

我测试了三个示例字符串。我用^标记了预期的匹配。

期望:

应与0-5匹配

代码语言:javascript
运行
复制
x...x
^^^^^

不应匹配

代码语言:javascript
运行
复制
xx...xx

应与2-7匹配:

代码语言:javascript
运行
复制
xxx...xxx
  ^^^^^

应与3-8匹配:

代码语言:javascript
运行
复制
xxxx...xxxx
   ^^^^^

我的问题是:

我还没有找到一种在不匹配xx的情况下匹配x的方法,我也没有什么想法可以尝试了。请帮帮我。这是当前的结果:https://regex101.com/r/OqSMuO/5

提前谢谢你!

EN

回答 3

Stack Overflow用户

发布于 2018-05-17 04:09:37

我觉得这符合你的意图。

代码语言:javascript
运行
复制
^(?:(x[^x]{3}x)|x{2,}(x[^x]{3}x)x{2,})$

它被分成两部分,或者合在一起:

(x[^x]{3}x)x...x的大小写完全匹配

x{2,}(x[^x]{3}x)x{2,}xxx...xxx匹配,但与xx...xx不匹配

注意:这对不平衡匹配没有帮助。例如,(xxx...xxxx)仍然与正则表达式匹配。然而,据我所知,您不能仅仅使用正则表达式来解决这个问题。为此,您需要一个堆栈。

票数 1
EN

Stack Overflow用户

发布于 2018-05-18 02:09:08

如果前导次数x应该与尾随次数相同,则可以使用backreference来捕获组1:

^(x*)(x[^x]+x)(\1)$

从字符串^的开头开始,在组1中捕获0次或更多次x。然后在组2中捕获x,一次或多次不是x,后面跟着使用否定字符类的x (x[^x]+x)。此组将包含您的匹配项。

最后,使用反向引用\1再次匹配与组1中相同的值,并断言字符串$的结尾。

代码语言:javascript
运行
复制
const strings = [
  "x...x",
  "xx...x",
  "xx...",
  "xx..xx",
  "xxx...xxx",
  "xxxx...xxxx",
];
let pattern = /^(x*)(x[^x]+x)(\1)$/;

strings.forEach((s) => {
  let res = s.match(pattern);
  if (res) {
    console.log(s + " --> " + s.match(pattern)[2]);
  } else {
    console.log(s + " --> no match.");
  }
});

票数 0
EN

Stack Overflow用户

发布于 2018-05-18 16:54:03

这将捕获除以两个"xx“(xx...xx)开头的x...x之外的所有其他one。

代码语言:javascript
运行
复制
(?:^x{0}|x{2,})(x...x)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50378996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档