【问题标题】:Filter out substrings that include keywords in a text in Javascript with Regex使用正则表达式过滤掉包含 Javascript 文本中关键字的子字符串
【发布时间】:2019-11-24 14:30:11
【问题描述】:

我有一个解决一个复杂的问题: 我想从可能的长文本中过滤掉子字符串。某些关键字表示子字符串。仅当关键字前面至少有一个字符(不是空格或其他关键字)时,才应该匹配。然后他们关键字前面的每个字符也应该包含在匹配中。为此,我想在 JavaScript 中使用正则表达式。

我的关键字是:“:yellow:”、“:black:”、“:green:”、“:blue:”、“:red:”

例如,我有这样的文本:" :green: aba :red: gd efg:blue: :yellow: sdg:red: sea gea e :black: "

现在我想在这个字符串上使用 match() 和一个 re 给我这些匹配:" aba :red:"、"gd efg:blue":、"sdg:red:"、sea gea e :black :

:green: 开头不应该匹配,因为它前面没有字符。 :yellow: 也不应该匹配,因为它前面有一个不同的关键字(在这种情况下是 :blue:)

我尝试使用否定前瞻表达式(如 (?!))来防止在关键字先于其他关键字时进行匹配。 但它并没有给我想要的结果。

    /((?!(:yellow:|:black:|:green:|:blue:|:red:))\S+\s*)+(:yellow:|:black:|:green:|:blue:|:red:)/g
    
    let ar1 = text1.match(re1);
    
    console.log(ar1);

这是我的输出: ['绿色:aba:红色:', 'gd efg:蓝色::黄色:', 'sdg:red: sea gea e:black:' ]

但我想要这个:

['aba:red:', 'gd efg:蓝色:', 'sdg:红色:', 'sea gea e:black:' ]

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    您可以通过将: 放在其外部来缩短交替,而不是匹配\S+,您可以使用negated character class 不匹配空格字符或:

    要匹配多个“单词”,您可以重复匹配空格并再次使用否定字符类。

    (?!:(?:yellow|black|green|blue|red):)[^\s:]+(?: [^\s:]+)*\s*:(?:yellow|black|green|blue|red):
    

    说明

    • (?! 负前瞻,断言右边的不是
      • :(?:yellow|black|green|blue|red): 匹配: 之间列出的任何一个
    • ) 关闭负前瞻
    • [^\s:]+ 匹配 1 次以上不是空白字符或 :
    • (?: [^\s:]+)* 重复 0+ 次匹配空格,然后 1+ 次不是空白字符或 :
    • \s* 匹配 0+ 个空白字符
    • :(?:yellow|black|green|blue|red): 匹配: 之间列出的任何一个

    Regex demo

    const regex = /(?!:(?:yellow|black|green|blue|red):|\s)[^\s:]+(?: [^\s:]+)*\s*:(?:yellow|black|green|blue|red):/g;
    const str = ` :green: aba :red: gd efg:blue: :yellow: sdg:red: sea gea e :black: `;
    console.log(str.match(regex));

    【讨论】:

      猜你喜欢
      • 2011-03-07
      • 1970-01-01
      • 2011-05-08
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多