字符串示例:
~~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]+
匹配一个或多个不是~
的字符,因为我们不想交叉两个闭合的~~
,也不匹配r
或n
,因为我们也不想交叉换行字符。
~~
匹配两个文字~
。
$
匹配行尾
参见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, "");