JavaScript regex匹配相同字符的精确数目



字符串示例:

~~333~~

我需要得到在

之间的所有内容
~~

正则表达式:

/^(~{2})(.*?)(~{2})$/gm

但是它也得到这个字符串:

~~~333~~~

还有这个

~~~~333~~~~

什么正则表达式将只得到第一个?

您的regex匹配后两个测试用例的原因是您的通配符.正在拾取内部~s。要解决这个问题,并使它只匹配数字,可以这样做:

/^~{2}([0-9]*)~{2}$/gm

如果您想捕获其他字符,只要它们不是~,您可以匹配除~字符以外的所有字符,如下所示:

^~{2}([^~]*)~{2}$

这两个都只匹配第一个测试用例~~333~~,而不匹配其他的。

您可以在两端使用环顾方法来确保波浪号不在~~标记的前面或后面。

var input = "~~333~~ ~~~444~~~ ~~~~5555~~~~";
var matches = input.match(/(?:^|[^~])~~([^~]+)~~(?!~)/g);
console.log(matches);

试试这个:

^~~[^~rn]+~~$

^匹配行首

~~匹配两个~

[^~rn]+匹配一个或多个不是~的字符,因为我们不想交叉两个闭合的~~,也不匹配rn,因为我们也不想交叉换行字符。

~~匹配两个文字~

$匹配行尾

参见regex demo。

下面的正则表达式将匹配开头和结尾的两个'~'。以及两者之间的任意字符串

/^(~{2})([^~]*)(~{2})$

由于您在(.*?)的当前模式中使用锚来匹配之间的任何内容,并且您在支持后看断言的环境中使用JavaScript,因此您可以使用单个捕获组来获得所需的值:

^~~(?!~)(.*)~(?<!~.)~$

  • ^字符串
  • 起始
  • ~~Match字面意思
  • (?!~)负向前看,断言当前位置的右边不是a ~
  • (.*)Capturegroup 1,匹配任何字符0次或更多次
  • ~(?<!~.)匹配第一个~并断言当前位置的左侧没有一个~
  • ~匹配第二个~
  • $字符串结束

查看regex101演示。

const regex = /^~~(?!~)(.*)~(?<!~.)~$/;
[
"~~333~~",
"~~this is ~~~~~ a test ~~ test~~",
"~~~333~~~",
"~~~~333~~~~",
"~~~this is ~ a test ~~ test~~test~~"
].forEach(s => {
const m = s.match(regex);
if (m) console.log(m[1]);
});

其他变化

如果您想捕获1个或多个数字之间:

^~~(d+)~~$

regex101演示如果您想捕获多个不重叠的出现:

(?<!~)~~(?!~)(.*?)~(?<!~.)~(?!~)

regex101演示如果您想要捕获有重叠的多次出现:

(?<!~)~~(?!~)(.*?)(?=~(?<!~.)~(?!~))

regex101演示

您可以尝试下面的代码。这是为了删除所有特殊字符,只返回文本和数字值:)


/[^a-zA-Z ]/g
var str = "~~333~~";
str.replace(/[^a-zA-Z ]/g, "");



最新更新