2

我已经搞砸了几个小时,但我似乎无法破解它。我基本上是在尝试创建一个类似于 php 的 echo(不带参数)的 js Regexp。这是模式,以及我试图获得的值。

var reg = /echo +[^\s(].+[//"';]/;

'echo "test";'.match(reg);              //echo "test";
'echo test'.match(reg);                 //echo test
'echo "test me out"; dd'.match(reg);    //echo "test me out"
'echo "test me out" dd'.match(reg);     //echo "test me out"
'echo test;'.match(reg);                //echo test;
'echo "test "'.match(reg);              //echo "test "
"echo 'test'".match(reg);               //echo 'test'


//These should all return null
'echo (test)'.match(reg);
'/echo test'.match(reg);
'"echo test"'.match(reg);
"'echo test'".match(reg);

我在这里做了一个例子:http: //jsfiddle.net/4HS63/

4

3 回答 3

2

你似乎在寻找

var reg = /^echo +(?:\w+|"[^"]*"|'[^']*');?/;
^        // anchor for string beginning
echo     // the literal "echo"
 +       // one or more blanks
(?:      // a non-capturing group around the alternation
 \w+     // one or more word characters ( == [a-zA-Z0-9_])
|        // or
 "[^"]*" // a quote followed by non-quotes followed by a quote
|'[^']*' // the same for apostrophes
)
;?       // an optional semicolon
于 2013-08-02T16:00:02.270 回答
0

您可以尝试这种允许引号内转义引号的模式:

/^echo (?:"(?:[^"\\]+|\\{2}|\\[\s\S])*"|'(?:[^'\\]+|\\{2}|\\[\s\S])*'|[a-z]\w*)/
于 2013-08-02T16:10:06.717 回答
0

此正则表达式既匹配您想要的内容,捕获正在搜索的文本:

var reg = /^[\t ]*echo +(?:'([^']*)'|"([^"]*)"|(\w+))/;

jsFiddle

例如,'echo "test"'.match(reg)将返回["echo "test"", undefined, "test", undefined],您可以使用它theMatch[2]来获取包含 的字符串test

但是,可以使用第一次、第二次或第三次捕获,具体取决于引用的样式。我不知道如何在不使用JavaScript 不支持的lookbehind的情况下让它们都使用相同的捕获。

于 2013-08-02T16:03:52.833 回答