JavaScript正则表达式,以非常精确地匹配相同字符的数量

agxfikkp  于 2023-01-01  发布在  Java
关注(0)|答案(6)|浏览(147)

字符串示例:

~~333~~

我需要把所有东西

~~

有效的正则表达式:

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

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

~~~333~~~

还有这个

~~~~333~~~~

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

yvt65v4c

yvt65v4c1#

正则表达式匹配后两个测试用例的原因是因为通配符.选择了内部的~。要解决此问题,使其仅匹配数字,您可以执行以下操作:

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

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

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

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

wfsdck30

wfsdck302#

您可以在两端使用环视方法,以确保波浪线不在~~标记之前或之后。

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

mspsb9vt3#

下面的正则表达式将精确匹配开头和结尾的两个'~',以及它们之间的任何字符串。

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

pokxtpni4#

试试这个:

^~~[^~\r\n]+~~$

^匹配行的开始。
~~匹配两个文本~
[^~\r\n]+匹配一个或多个不是~的字符,因为我们不想交叉两个结束的~~,也不匹配\r\n,因为我们也不想交叉换行符。
~~匹配两个文本~
$与行尾匹配。
参见regex demo

svgewumm

svgewumm5#

由于您在当前模式中使用锚点与(.*?)匹配,以匹配两者之间的 * 任何内容 *,并且您在supports a lookbehind assertion环境中使用JavaScript,因此可以使用单个捕获组来获得所需的值:

^~~(?!~)(.*)~(?<!~.)~$
    • 说明**
  • ^字符串开始
  • ~~按字面匹配
  • (?!~)负前瞻,Assert不是直接在当前位置右侧的~
  • (.*)捕获组1,匹配任何字符0次或多次
  • ~(?<!~.)匹配第一个~并Assert当前位置的左侧没有直接的~
  • ~匹配第二个~
  • $字符串结束

参见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

pu82cl6c

pu82cl6c6#

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

/[^a-zA-Z ]/g

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

相关问题