通过RegEx检查特定的后缀,然后选择包括后缀在内的整个匹配项

时间:2019-06-20 06:35:29

标签: javascript regex

首先,这是我在社区中的第一个问题,因此请原谅我的过错专家!我正在学习正则表达式,并且遇到无法自行创建答案的情况。

让我们说如果有巨大的段落,我们可以先根据特定的后缀(例如'%')进行匹配,然后再返回并选择所需的逻辑(包括后缀)吗?

例如文本的一部分是“ abcd efghMNP 0.40%ijkl mnopSNP -3.20%xyz”。 现在,在这里,如果您注意到了-我得到了很多-就有

/([MS]NP[\s\d\.-%]+)/

我要用空白替换“ MNP 0.40%”或“ SNP -3.20%”。替换零件似乎很容易:),但是问题是我的所有学习工作只有在比赛结束时存在'%'的情况下,我才无法选择。

我希望达到的匹配顺序是-如果存在后缀'%',则匹配先前的模式,如果成功,则选择所有包括后缀的内容,并替换为空。

3 个答案:

答案 0 :(得分:1)

有几种表达式可以做到这一点,例如,这一表达式具有附加的约束:

[A-Z]{3}\s+[-+]?[0-9.]+\s*%

测试

const regex = /[A-Z]{3}\s+[-+]?[0-9.]+\s*%/gm;
const str = `abcd efghMNP 0.40 % ijkl mnopSNP -3.20 % xyz

"MNP 0.40 %" or "SNP -3.20 %"`;
const subst = ``;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log(result);

Demo 1

或简化版本为:

[A-Z]{3}(.*?)%

Demo 2

答案 1 :(得分:1)

如果遇到后缀%,则无法返回到匹配项,但是您可以做的是使其成为模式的一部分,因此必须进行匹配。

在Javascript中,您可以执行零长度的lookahead assertion (?=,以确保右边的内容包含模式,或者在这种情况下为%,但这并不是真正的好处。在这种情况下,您希望它成为比赛的一部分。

更具体的匹配可能是:

[MS]NP\s*-?\d+(?:\.\d+)?\s*%
  • [MS]NP匹配MS后跟NP
  • \s*-?匹配0+次空白字符,后跟可选的-
  • \d+(?:\.\d+)?匹配1位以上的数字,后跟可选部分以匹配点和1位以上的数字
  • \s*%匹配0+个空白字符,然后匹配%

Regex demo

答案 2 :(得分:0)

non-capturing parentheses使用正则表达式,如下所示:

string = 'example string with an intended nested string to match.';
regexp = /(?:intended)(.*)(?:to match)/;
firstMatch = regexp.exec(string)[1]; // " nested string "

问号在正则表达式中有多种用途,括号问号冒号(?:more regex)是non-capturing parentheses

有关exec()string.match()regular expressions.的更多详细信息,请参见MDN。