【问题标题】:Javascript Regular Expression excluding a wordJavascript 正则表达式不包括一个单词
【发布时间】:2012-01-15 13:17:11
【问题描述】:

我熟悉javascript regular expression to not match a word,但它对我没有多大帮助。当给定一个字符串(带有任何类型的字符)时,我希望围绕两个标记解析它,“//”和“\\”。我做了以下事情:

var patt = /.*[^"//"]/gm;
patt.exec(str);

但它似乎匹配引号之间出现的任何字符,即“/”和“//”。我怎样才能实现它?

【问题讨论】:

  • 你想做什么?给我们一个str 的例子和预期的结果。
  • 你到底想要什么?你能在你的问题中加入一些一致的例子吗?比如一对输入输出对。
  • 您能否举例说明您想要实现的目标?目前还不清楚你想在这里做什么(至少对我来说)。
  • @RobW 我希望解析指定标记之间的给定字符串,它们是“//”和“\\”。例如 var str = "hey//you//how\\you\\are//doing";
  • @RobW 尝试纠正,但它不起作用。

标签: javascript regex parsing


【解决方案1】:

当你用^ 开始一个字符类时(就像你在[^"//"] 中所做的那样),它的意思是“除了列出的字符之外的任何字符”。所以[^"//"] 的意思是“匹配除"/ 之外的任何字符之一(它忽略了你已经列出了它们两次的事实)。

如果您尝试匹配两个斜杠 (//) 和一个反斜杠 (\) 之间的文本(根据您的问题;您后来发表评论建议这是两个反斜杠,我稍后会解决),那么:

var match = str.match(/\/\/(.*?)\\/);    // Match between // and \

请注意,我们必须对斜线进行转义,因为斜线是正则表达式的分隔符;我们必须转义反斜杠,因为反斜杠是转义字符。

上面的意思是“匹配两个斜杠,后跟零个或多个任意字符,后跟一个反斜杠。” ?* 之后使* 非贪婪(因此它将消耗尽可能少的字符来满足表达式)。 () 创建一个捕获组,它在匹配对象中将接收在该位置匹配的字符。

例子:

test("foo");
test("foo //bar");
test("foo //bar\\");
test("foo //bar\\ baz");
test("bar\\ baz");
test("//bar\\ baz");
test("foo //bar\\ baz \\ more \\ more");

function test(str) {
    var m = str.match(/\/\/(.*?)\\/),
        cap = (m && m[1]) || "<em>nothing</em>";
    display("Str: <code>" + str + "</code>: Captured <code>" + cap + "</code>");
}

输出:

Str: foo: 捕获nothing

Str: foo //bar: 捕获nothing

Str:foo //bar\:捕获bar

Str: foo //bar\ baz: 捕获bar

Str: bar\ baz: 捕获nothing

Str: //bar\ baz: 捕获bar

Str:foo //bar\ baz \ more \ more:捕获bar

Live copy

或者对于两个反斜杠:

var match = str.match(/\/\/(.*?)\\\\/);  // Match between // and \\

Live copy(输出相同,只是加了两个反斜杠)

一些关于 JavaScript 正则表达式的阅读:

【讨论】:

  • 谢谢你的回答,虽然我不明白如何使用它,这是我试图解析的一个例子——“嘿[[你[[如何[[你]]是[[正在做”; -- 分隔符是“[[”和“]]”。
  • @MrIzik:你想用这个例子做什么?具体来说,用嵌套?您可能需要贪婪捕获和循环而不是非贪婪版本,尽管这些分隔符是不平衡的。还是您只想获得["hey", "you", "how", "you", "are", "doing"](这与实际提出的问题完全不同)。
【解决方案2】:

简单点怎么样

var tokens = str.split(/\/\/|\\\\/);

【讨论】:

    猜你喜欢
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    相关资源
    最近更新 更多