我熟悉javascript regular expression to not match a word但这对我没有多大帮助。当给定一个字符串(具有任何类型的字符)时,我希望围绕两个标记“//”和“\\”来解析它。我做了以下事情:
var patt = /.*[^"//"]/gm;
patt.exec(str);
但它似乎匹配引号之间出现的任何字符,即“/”和“//”。我怎样才能实现它?
最佳答案
当您使用 ^
开始字符类(如 [^"//"]
中所示)时,它的意思是“除列出的字符之外的任何字符”。因此 [^"//"]
表示“匹配除 ”之外的任何字符之一
和 /
(它忽略了您列出了每个字符的事实其中两次)。
如果您尝试匹配两个斜杠 (//
) 和一个反斜杠 (\
) 之间的文本(根据您的问题;您后来发表了评论建议它是两个反斜杠,我稍后会解决这个问题),然后:
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
: Capturednothing
Str:
foo //bar
: Capturednothing
Str:
foo //bar\
: Capturedbar
Str: foo
//bar\ baz
: Capturedbar
Str:
bar\ baz
: Capturednothing
Str:
//bar\ baz
: Capturedbar
Str:
foo //bar\ baz \ more \ more
: Capturedbar
或者两个反斜杠:
var match = str.match(/\/\/(.*?)\\\\/); // Match between // and \\
Live copy (输出是相同的,只是有两个反斜杠)
一些关于 JavaScript 正则表达式的阅读:
- The spec (这是一个方便的可链接 HTML 渲染;规范的渲染是 PDF here)
- Mozilla's excellent
RegExp
page
关于Javascript 正则表达式排除某个单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8869891/