正则表达式在第 n 个“$”分隔符 js 之后获取字符串的特定部分

Regex get specific part of string after the nth "$" delimiter, js

提问人:user874737 提问时间:3/9/2023 更新时间:3/10/2023 访问量:67

问:

所以我有这个不和谐的命令。

$command这是我的第一条短信 $这是我的第二条短信 $这是我的 第三篇课文 $这是我的第四篇课文

例如,我需要获取第三个文本部分,它应该像这样输出:这是我的第三个文本。删除其他文本。

所以它应该是这样的。

  1. 获取 $ 的第三次出现。
  2. 删除文本的其余部分:$command这是我的第一个文本 $ 这是我的第二个文本 $$ 这是我的第四个文本
  3. 获取这是我的第三个文本部分。

你如何在正则表达式中做到这一点?我在这里搜索了线程,有些人说使用类似捕获组的东西,但我无法让它工作。

(?:\$){2}(\s.*)
JavaScript 则表达式 字符串 不和谐.js 匹配

评论


答:

1赞 Unmitigated 3/9/2023 #1

您可以使用 匹配,然后是其他字符。\$[^$]+$

let s = '$command this my first text $ this is my second text $ this is my third text $ this is my fourth text';
let res = s.match(/(?:\$[^$]+){2}\$([^$]+)/)[1].trim();
console.log(res);

0赞 fnyger 3/9/2023 #2

let s = '$command this my first text $ this is my second text $ this is my third text $ this is my fourth text';
let res = s.match(/(?<=((?<=\$).*?\$){2}) this is my.*?(?=\$)/)[0];
console.log(res);

库应该接受积极的前瞻和后视,因此您可以尝试以下操作:

(?<=((?<=\$).*?\$){2}) this is my.*?(?=\$)
1赞 The fourth bird 3/10/2023 #3

使用捕获组:

^(?:[^$]*\$){3}\s*([^$]*[^\s$])

解释

  • ^字符串的开头
  • (?:非捕获组将作为整体部件重复
    • [^$]*\$匹配 than 和 以外的可选字符$$
  • ){3}关闭非捕获组并重复 3 次
  • \s*匹配可选的空格字符
  • (捕获组 1
    • [^$]*匹配可选字符,而不是$
    • [^\s$]匹配非空格字符,而不是$
  • )关闭组 1

观看正则表达式演示

const s = "$command this my first text $ this is my second text $ this is my third text $ this is my fourth text";
const regex = /^(?:[^$]*\$){3}\s*([^$]*[^\s$])/;
const m = s.match(regex);
if (m) console.log(m[1])

如果支持,则使用后向断言仅获取匹配项:

const s = "$command this my first text $ this is my second text $ this is my third text $ this is my fourth text";
const regex = /(?<=^(?:[^$]*\$){3}\s*)[^\s$](?:[^$]*[^\s$])?/;
const m = s.match(regex);
if (m) console.log(m[0])