【问题标题】:Excluding a string in a regular expression在正则表达式中排除字符串
【发布时间】:2017-04-13 12:10:14
【问题描述】:

比如我有这样的表达方式

expression1
expression2 expression3

如果“expression1”不是不需要的字符串(让我称之为不需要的),我想在正则表达式中匹配“expression2 expression3”。所以,应该是这样的:

unwanted
expression2 expression3 // Not Matched...

string
expression2 expression3 // Matched...

我该怎么做?我尝试过类似的方法:

(?!unwanted\n)(expression2)[ ]+(expression3)

但它不起作用。可能是什么问题?

提前谢谢...

【问题讨论】:

标签: javascript regex


【解决方案1】:

将不需要的字符串捕获到组 1 中并检查它是否为 undefined。如果是,则没有不需要的文本,您可以抓取该匹配项,否则,丢弃它:

var regex = /(unwanted\n)?(expression\d+)\s+(expression\d+)/g;
var str = "unwanted\nexpression2 expression3\n\nstring\nexpression4 expression5";
var res = [], m;
while ((m = regex.exec(str)) !== null) {
  if (m[1] === undefined) res.push(m[0]);
}
console.log(res);

【讨论】:

  • 实际上,我担心不需要的字符串应该在表达式 2&3 的上方 1 行(如果存在)。也就是说,它们之间不会有任何其他字符串。
  • 没问题,使用/(^unwanted\n)?(expression\d+)\s+(expression\d+)/gm - 如果存在unwanted,它将捕获整行。
  • 我们可以将结果作为正则表达式而不是数组,因为我将在函数中使用它吗?
  • 我们可以将结果作为正则表达式是什么意思?如果您需要 1 次匹配,只需删除 g 修饰符并使用 var resres = m[0] 并返回 res。请注意,此时无需使用捕获组捕获两个部分,只需使用/(^unwanted\n)?YOUR_PATTERN/m
【解决方案2】:

也许你可以从这个开始:

(?!unwanted.*)(?:^.{1,8}).*\s*(expression2 expression3)

基本上,它确保表达式前面至少有unwanted 中的字符数,不是 unwanted

如果您只想要 表达式,您将在捕获组 1 中获得它们。

See it here at regex101.

编辑: 看着这个我意识到它可能充满了警告,但它可能会让你开始。 (虽然现在看不到它们;)

编辑 2: 替代(我相信更好)需要 something,但不允许 unwanted 任何地方,在之前的行:

^(?!.*unwanted.*).+[\r\n](expression2 expression3)

Here it is at regex101.

【讨论】:

    猜你喜欢
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 2021-05-31
    • 2020-04-12
    • 1970-01-01
    相关资源
    最近更新 更多