JavaScript正则表达式匹配除字母

时间:2016-09-27 09:04:27

标签: javascript regex string

我需要匹配“测试”之后的特定字符串

  • 只要有一个(因此单独避免匹配“测试”)
  • 并且如果该字符串特别是字母“L”
  • 则避免匹配

喜欢这个

testing rest -> matches (rest)
testing what -> matches (what)
testing Loong -> matches (Loong)
testing N -> matches (N)
testing L -> this is not matched
testing LL -> matches (LL)
testing J -> matches (J)
testing -> this is not matched
testing -> this is not matched
testing L TY -> this specific string will not occur so it is irrelevant

并带引号

"testing rest" -> matches (rest)
"testing what" -> matches (what)
"testing Loong" -> matches (Loong)
"testing N" -> matches (N)
"testing L" -> this is not matched
"testing LL" -> matches (LL)
"testing J" -> matches (J)
"testing" -> this is not matched
"testing "-> this is not matched
"testing L TY" -> this specific string will not occur so it is irrelevant

我怎么能这样做?

4 个答案:

答案 0 :(得分:1)

这应该这样做:

/^testing ([^L]|..+)$/

或者,如果在匹配之前无法删除引号:

/^"?testing ([^L"]|.[^"]+)"?$/

阐释:

第一部分: ^ testing 搜索字符串的常量元素 - 这很容易。

然后,atomic group(在圆括号中): [^ L] | .. + ,它由 OR 语句(管道)组成。

OR 的左侧,我们有一个所有一个字符串的搜索模式(字母“ L ”除外)。它是定义集合(使用方括号 [] )和否定(使用此符号: ^ ,这意味着当它首先在方括号中签名时出现否定)。

在右侧,我们有搜索模式,任何至少两个字符长的东西。这是通过fisrt匹配任何东西(使用点)然后再做任何事情来完成的,这次至少一次(使用加号: + )。

总结这一点,我们应该得到你所要求的那种逻辑。

答案 1 :(得分:1)

如果"测试"我建议使用基于前瞻性的正则表达式来使比赛失败。在字符串结尾之前跟随L和0+空格:

/^"?testing\s+((?!L?\s*"?\s*$).*?)"?$/

请参阅regex demo

<强>详情:

  • ^ - 字符串开头
  • "? - 可选的"
  • testing - 文字字符串testing
  • \s+ - 一个或多个空格
  • ((?!L?\s*"?\s*$).*?) - 第1组捕获除了换行符号之外的任何0 +字符尽可能少(由于惰性*?,以便稍后考虑尾随"但仅限于不等于L(1或0次出现)或后跟字符串结尾的空格($)和\s*"?\s*也会考虑可选的尾随"
  • "? - 可选的"
  • $ - 字符串结束。

因此,如果&#34;测试&#34; (?!L?\s*$)否定前瞻将使比赛失败。接下来是:

  • 字符串结尾
  • L
  • 空格
  • L和空白......

可选"

&#13;
&#13;
var ss = [ '"testing rest"', '"testing what"', '"testing Loong"', '"testing N"', '"testing L"', '"testing"', '"testing "' ]; // Test strings
var rx = /^"?testing\s+((?!L?\s*"?\s*$).*?)"?$/;   
for (var s = 0; s < ss.length; s++) {                  // Demo
  document.body.innerHTML += "Testing \"<i>" + ss[s] + "</i>\"... ";
  document.body.innerHTML += "Matched: <b>" + ((m = ss[s].match(rx)) ? m[1] : "NONE") + "</b><br/>";
}
&#13;
&#13;
&#13;

如果您只是想避免匹配&#34;测试&#34;最后的L字符串(在可选"之前),您可以将模式缩短为

/^"?testing\s((?!L?"?$).*?)"?$/

请参阅this regex demo(因为针对多行字符串执行测试,\s被替换为演示中的空格

答案 2 :(得分:0)

这是你想要的正则表达式。它将字符串开头与测试匹配,然后匹配一个或多个空格字符,然后匹配大小为2或更大的字符。

/^testing\s+\w{2,}/

答案 3 :(得分:0)

我相信Can't get plist URL in Swift是您正在寻找的正则表达式:

/^"(testing(?: )?.*)"$/