正则表达式找到匹配两个字符串的模式,它们之间有“x”个空格

时间:2017-07-20 22:41:14

标签: javascript node.js regex

我有一种情况,我正在寻找彼此跟随的特定单词,但我不知道这些单词之间有多少空格,现在还有我想到的括号。

以下是一个例子:

word1 word2('word3')

我正在寻找的正则表达式必须找到可以有任意数量空格的模式:

    word1和word2之间的
  • 在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

就是这样。我不知道这些价值会是多少或有多少,我所知道的只是'汽车'和'奥迪'。

3 个答案:

答案 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)

我们需要两个正则表达式:

  1. 第一个正则表达式将用于提取字符串,如:car audi ('q5')
  2. 第二个正则表达式将用于清理匹配的字符串以获取:q5
  3. 
    
    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 audiq5匹配。你表示你对第三个单词感兴趣,这就是为什么我把[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"]
    
    
    

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