我有一种情况,我正在寻找彼此跟随的特定单词,但我不知道这些单词之间有多少空格,现在还有我想到的括号。
以下是一个例子:
word1 word2('word3')
我正在寻找的正则表达式必须找到可以有任意数量空格的模式:
在word2和(
之间(和
在'和)
我只想要word3,而不是'word3'。
任何人都知道正则表达式会是什么样子?我很难过。
我不知道word3是什么,但我知道word1和word2是什么。
另一个例子:
字符串中可能会多次出现此模式。
说我的文字如下:
car audi('q5') blah blah blah car audi ( 'a3') blah blah
more blah and even more car audi( 'r8' ) blah end.
我想要的就是:q5,a3,r8
就是这样。我不知道这些价值会是多少或有多少,我所知道的只是'汽车'和'奥迪'。
答案 0 :(得分:2)
这个怎么样:
/word1\s*word2\s*\(\s*'word3'\s*\)/g
请参见此工作Regexr。
let strings = [
"word1 word2('word3')",
"word1 word2('word3')",
"word1 word2 ('word3')",
"word1 word2( 'word3')",
"word1 word2('word3' )",
"word1 word2 ( 'word3' )",
"word1word2('word3')",
];
for (const str of strings) {
console.log(`"${str}" -> ${/word1\s*word2\s*\(\s*'word3'\s*\)/g.test(str)}`);
}
结果:
"word1 word2('word3')" -> true
"word1 word2('word3')" -> true
"word1 word2 ('word3')" -> true
"word1 word2( 'word3')" -> true
"word1 word2('word3' )" -> true
"word1 word2 ( 'word3' )" -> true
"word1word2('word3')" -> true
答案 1 :(得分:0)
var strr = "word1 word2('word3')somethingDifferent";
console.log( strr.replace(/(\(|\)|')/g,' ').replace(/\s+/g , ' '));

答案 2 :(得分:0)
我们需要两个正则表达式:
car audi ('q5')
q5
var str = [
"car audi('q5') blah blah blah car audi ( 'a3') blah blah",
"more blah and even more car audi( 'r8' ) blah end."
].join("\n") + "\n";
var m = str.match(/(car)\s*(audi)\s*\(\s*'(\w+)'\s*\)/g);
console.log("Intermediate results:");
console.log(m);
// m = [
// "car audi('q5')",
// "car audi ( 'a3')",
// "car audi( 'r8' )"
// ]
m = m.map(function (e) {
return e.match(/(car)\s*(audi)\s*\(\s*'(\w+)'\s*\)/)[3];
} );
console.log("Final results:");
console.log(m);
// m = [ 'q5', 'a3', 'r8' ]

让我们理解为什么会这样。 我使用的第一个正则表达式如下所示:
/(car)\s*(audi)\s*\(\s*'(\w+)'\s*\)/g
尽管我使用了一个捕获组,但它们会被忽略,因为我最后放了一个/g
。这将匹配符合您所需模式的所有句子。它会找到那3个汽车奥迪句子。
然后,我使用的第二个正则表达式如下:
/(car)\s*(audi)\s*\(\s*'(\w+)'\s*\)/
即。我删除了/g
。现在,每个单词的捕获组将分别与car
audi
和q5
匹配。你表示你对第三个单词感兴趣,这就是为什么我把[3]放在最后只抓住第三个单词并丢弃比赛中的其他所有内容。
以下是正则表达式中关键组件的解释:
\w+
将匹配包含1个或多个字母或数字的字词\s*
将匹配0,1个或更多空格。(\w+)
不仅会与单词匹配,还会将其放入捕获组(即给我一份副本)这是解决方案的简化版本:
var str = [
"car audi('q5') blah blah blah car audi ( 'a3') blah blah",
"more blah and even more car audi( 'r8' ) blah end."
].join("\n") + "\n";
var m = (str.match(/(car)\s*(audi)\s*\(\s*'(\w+)'\s*\)/g) || []).map(function (e) {
return e.match(/(car)\s*(audi)\s*\(\s*'(\w+)'\s*\)/)[3];
} );
console.log(m); // ["q5","a3","r8"]

另请注意,在最终版本中,我添加了|| []
。这是为了处理没有匹配句子的情况,以确保我们返回一个干净的空数组,而不是由于空中间结果而导致错误。