如果他们之前有文章,请丢弃正则表达式中的令牌

时间:2014-04-04 14:56:38

标签: javascript regex

我希望我的正则表达能匹配" foo"并且" bar",但如果" foo"或" bar"从" a",""或""开始。

foobar不保证位于字符串的开头或结尾。

示例匹配:

"end of Foo." [1 Match: Foo]
"end of bar." [1 Match: bar]
"The foo and bar" [1 Match: bar]
"foo bar" [2 Matches: foo, bar]

示例无匹配:

"foobar"
"foofoo"
"the foo"
"a bar"
"andbar"
"the foo goes to a bar."

我想我可能不得不做一个负面的看法?如果是这样,是否可以将其转换为使用JS的可移植性的负向前瞻?

我已经尝试了

/(\bfoo\b|\bbar\b)(?!the|a(n)?)/igm

但这不起作用。

非常感谢。

2 个答案:

答案 0 :(得分:2)

您可能会发现编写正则表达式以匹配拼写向后的单词并在匹配之前反转字符串的字符顺序更容易。然后,您可以使用Negative Look Behind模拟Negative Look Ahead

所以带有反转词的正则表达式将是:

/\b(?:oof|rab)\b(?!eht|n?a)/igm

可视化:
Regular expression visualization

然后是JavaScript:

function ReverseString(str) {
    return str.split("").reverse().join("");
}

var myRegex = /\b(?:oof|rab)\b(?!eht|n?a)/igm;
var myString = "This is foo possibly";

alert( ReverseString(myString).match(myRegex) );

答案 1 :(得分:1)

一种方法是测试您测试的每个字符串是否存在捕获组。模式必须包含您想要避免的情况(跳过字符串的这一部分)。捕获组包含允许的案例。例如:

/\b(?:(?:the |an? )(?:foo|bar)|(foo|bar))\b/gi

示例:

var re = /\b(?:(?:the |an? )(?:foo|bar)|(foo|bar))\b/gi;
var str = "the foo a bar FoO BAr";
var myArray;
var result = Array();
while ((myArray = re.exec(str)) !== null) {
    if (myArray[1]) { // <- test if the capture group is defined
        result.push(myArray[1]);
    }
}

console.log(result);