首先,这是我在社区中的第一个问题,因此请原谅我的过错专家!我正在学习正则表达式,并且遇到无法自行创建答案的情况。
让我们说如果有巨大的段落,我们可以先根据特定的后缀(例如'%')进行匹配,然后再返回并选择所需的逻辑(包括后缀)吗?
例如文本的一部分是“ abcd efghMNP 0.40%ijkl mnopSNP -3.20%xyz”。 现在,在这里,如果您注意到了-我得到了很多-就有
/([MS]NP[\s\d\.-%]+)/
我要用空白替换“ MNP 0.40%”或“ SNP -3.20%”。替换零件似乎很容易:),但是问题是我的所有学习工作只有在比赛结束时存在'%'的情况下,我才无法选择。
我希望达到的匹配顺序是-如果存在后缀'%',则匹配先前的模式,如果成功,则选择所有包括后缀的内容,并替换为空。
答案 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);
或简化版本为:
[A-Z]{3}(.*?)%
答案 1 :(得分:1)
如果遇到后缀%
,则无法返回到匹配项,但是您可以做的是使其成为模式的一部分,因此必须进行匹配。
在Javascript中,您可以执行零长度的lookahead assertion (?=
,以确保右边的内容包含模式,或者在这种情况下为%
,但这并不是真正的好处。在这种情况下,您希望它成为比赛的一部分。
更具体的匹配可能是:
[MS]NP\s*-?\d+(?:\.\d+)?\s*%
[MS]NP
匹配M
或S
后跟NP \s*-?
匹配0+次空白字符,后跟可选的-
\d+(?:\.\d+)?
匹配1位以上的数字,后跟可选部分以匹配点和1位以上的数字\s*%
匹配0+个空白字符,然后匹配%
答案 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。