-4

我需要制作一个正则表达式来识别除引号之间的文本之外的所有内容。这是一个例子:

my_var == "Hello world!"

我想得到my_var但没有Hello world!

我试过(?<!\")([A-Za-z0-9]+)了,但没有用。

4

4 回答 4

2

如果您愿意花时间google搜索或搜索stackoverflow,您会找到这个问题的答案,不仅是我,还有许多其他用户已经回答了这些问题。

@Pappa's使用 a 的答案negative lookbehind只会匹配一个简单的测试用例,而不是字符串中没有被引号括起来的所有内容。negative lookahead在这种情况下,如果您想匹配任何给定数据中的所有单词字符,我就足够了。

/[\w.-]+(?![^"]*"(?:(?:[^"]*"){2})*[^"]*$)/

观看现场演示

例子:

<?php

$text = <<<T
my_var == "Hello world!" foo /(^*#&^$ 
"hello" foobar "hello" FOO "hello" baz
Hi foo, I said "hello" $&@^$(@$)@$&*@(*$&
T;

preg_match_all('/[\w.-]+(?![^"]*"(?:(?:[^"]*"){2})*[^"]*$)/', $text, $matches);
print_r($matches);

输出

Array
(
     [0] => Array
        (
            [0] => my_var
            [1] => foo
            [2] => foobar
            [3] => FOO
            [4] => baz
            [5] => Hi
            [6] => foo
            [7] => I
            [8] => said
        )
)
于 2013-10-21T21:58:43.950 回答
2

你有一个接受的答案,但我仍然提交一次,因为我相信这个答案在捕捉更多边缘情况方面会更好:

$s = 'my_var == "Hello world!" foo';
if (preg_match_all('/[\w.-]+(?=(?:(?:[^"]*"){2})*[^"]*$)/', $s, $arr))
   print_r($arr[0]);

输出:

Array
(
    [0] => my_var
    [1] => foo
)

这通过使用前瞻来确保后面有偶数个双引号(需要平衡双引号并且没有转义)。

于 2013-10-21T21:59:31.120 回答
1

尽管我很遗憾因为回答这个问题而被否决,但我很感兴趣,所以还是这样做了。

(?<![" a-zA-Z])([A-Za-z0-9\-_\.]+)
于 2013-10-21T21:21:35.230 回答
0

这个简单的解决方案没有被提及(参见演示):

"[^"]*"(*SKIP)(*F)|[\w.-]+

参考

除了情况 s1、s2、s3 之外,如何匹配模式

于 2014-05-20T22:12:18.967 回答