字符串示例:
~~333~~
我需要把所有东西
~~
有效的正则表达式:
/^(~{2})(.*?)(~{2})$/gm
但是它也得到了这个字符串:
~~~333~~~
还有这个
~~~~333~~~~
什么正则表达式将只得到第一个?
yvt65v4c1#
正则表达式匹配后两个测试用例的原因是因为通配符.选择了内部的~。要解决此问题,使其仅匹配数字,您可以执行以下操作:
.
~
/^~{2}([0-9]*)~{2}$/gm
如果您想捕获其他字符,只要它们不是~,您可以匹配除~字符以外的所有字符,如下所示:
^~{2}([^~]*)~{2}$
这两个测试用例仅匹配第一个测试用例~~333~~,而不匹配其他测试用例。
wfsdck302#
您可以在两端使用环视方法,以确保波浪线不在~~标记之前或之后。
var input = "~~333~~ ~~~444~~~ ~~~~5555~~~~"; var matches = input.match(/(?:^|[^~])~~([^~]+)~~(?!~)/g); console.log(matches);
mspsb9vt3#
下面的正则表达式将精确匹配开头和结尾的两个'~',以及它们之间的任何字符串。
/^(~{2})([^~]*)(~{2})$
pokxtpni4#
试试这个:
^~~[^~\r\n]+~~$
^匹配行的开始。~~匹配两个文本~。[^~\r\n]+匹配一个或多个不是~的字符,因为我们不想交叉两个结束的~~,也不匹配\r或\n,因为我们也不想交叉换行符。~~匹配两个文本~。$与行尾匹配。参见regex demo。
^
[^~\r\n]+
\r
\n
$
svgewumm5#
由于您在当前模式中使用锚点与(.*?)匹配,以匹配两者之间的 * 任何内容 *,并且您在supports a lookbehind assertion环境中使用JavaScript,因此可以使用单个捕获组来获得所需的值:
(.*?)
^~~(?!~)(.*)~(?<!~.)~$
(?!~)
(.*)
~(?<!~.)
参见regex101 demo。
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 demo如果要捕获多个示例而不重叠:
(?<!~)~~(?!~)(.*?)~(?<!~.)~(?!~)
regex101 demo如果要捕获重叠的多个示例:
(?<!~)~~(?!~)(.*?)(?=~(?<!~.)~(?!~))
regex101 demo
pu82cl6c6#
您可以尝试下面的代码。这是删除所有特殊字符和返回文本和数字值只:)
/[^a-zA-Z ]/g var str = "~~333~~"; str.replace(/[^a-zA-Z ]/g, "");
6条答案
按热度按时间yvt65v4c1#
正则表达式匹配后两个测试用例的原因是因为通配符
.
选择了内部的~
。要解决此问题,使其仅匹配数字,您可以执行以下操作:如果您想捕获其他字符,只要它们不是
~
,您可以匹配除~
字符以外的所有字符,如下所示:这两个测试用例仅匹配第一个测试用例
~~333~~
,而不匹配其他测试用例。wfsdck302#
您可以在两端使用环视方法,以确保波浪线不在
~~
标记之前或之后。mspsb9vt3#
下面的正则表达式将精确匹配开头和结尾的两个'~',以及它们之间的任何字符串。
pokxtpni4#
试试这个:
^
匹配行的开始。~~
匹配两个文本~
。[^~\r\n]+
匹配一个或多个不是~
的字符,因为我们不想交叉两个结束的~~
,也不匹配\r
或\n
,因为我们也不想交叉换行符。~~
匹配两个文本~
。$
与行尾匹配。参见regex demo。
svgewumm5#
由于您在当前模式中使用锚点与
(.*?)
匹配,以匹配两者之间的 * 任何内容 *,并且您在supports a lookbehind assertion环境中使用JavaScript,因此可以使用单个捕获组来获得所需的值:^
字符串开始~~
按字面匹配(?!~)
负前瞻,Assert不是直接在当前位置右侧的~(.*)
捕获组1,匹配任何字符0次或多次~(?<!~.)
匹配第一个~并Assert当前位置的左侧没有直接的~~
匹配第二个~$
字符串结束参见regex101 demo。
如果要捕获1个或多个数字:
regex101 demo
如果要捕获多个示例而不重叠:
regex101 demo
如果要捕获重叠的多个示例:
regex101 demo
pu82cl6c6#
您可以尝试下面的代码。这是删除所有特殊字符和返回文本和数字值只:)