如何不匹配 javascript 中的某个正则表达式?

How not to match a certain regexp in javascript?

我想检查一个变量是否不匹配这个正则表达式:

DEMO

所以这是与我的代码中的正则表达式匹配的模式:

rxAfterPrint = new RegExp(/^ *\+ *("(?:[^"]*)"|(?:[a-zA-Z]\w*)) *(.*)$/);

并通过这种方式检查匹配:

var t2 = t[2].match(rxAfterPrint); 现在我想创建不匹配此模式的 e 变量 t3

我该怎么做?你能帮帮我吗?

你说的 "I want to create a variable that don't match this pattern" 是什么意思真的不清楚。由于 t2 是您的匹配项,因此您似乎希望 t3 成为不匹配的对象。

因为您要锚定到字​​符串的开头 (^),所以这是使用几乎相同的正则表达式进行否定前瞻的绝佳位置。从字面上看,我所做的就是在最后用 (?!).* 包围它..

output1.value = input.value.match(/^(?! *\+ *("(?:[^"]*)"|(?:[a-zA-Z]\w*)) *(.*)).*$/gm).join("\r\n")

另一种方法是像这样使用 replace(),但我认为 match() 是更好的选择。

output2.value = input.value.replace(/(^ *\+ *("(?:[^"]*)"|(?:[a-zA-Z]\w*)) *(.*)$\s*)+/gm,"")

对于这两种情况,我添加了 global 和 multiline 以便轻松地一次测试多行。如果您只测试一个,请删除 gm,否则它可能会错误地告诉您字符串通过或失败而导致错误。

演示:JSFiddle

(承认我有不公平的优势,因为我知道为什么会出现这个问题:

所以我猜您想将字符串连接作为打印语句的一部分来实现,如下所示:

<string> ::= '"' <character>* '"' | <variable>
<print> ::= 'print' <string> ('+' <string>)*
<print> ::= 'print' (<string> '+')* <string>

这两个 <print> 实际上表达相同,使用第二个版本你可以首先(在匹配 /^ *print */ 之后)尝试尽可能多地应用模式 rxConcat 如果这不匹配,然后你应用第二个表达式 rxStringValEOL 来匹配余数(如果没有成功,这是一个无效的语句):

rxConcat = new RegExp(/ *(?:"([^"]*)"|([a-zA-Z]\w*)) *\+ */);
rxStringValEOL = new RegExp(/ *(?:"([^"]*)"|([a-zA-Z]\w*)) *$/);

这也表明,设计一种对程序员和编写编译器的人来说都很容易的语言是相当困难的。