1

我的字符串测试是:

My name is "Ralph" ("France" is my country, "123" my age, ... , "an other text", ...)

我想得到引号中的字符串,但只有括号中的字符串。在我的示例中:字符串France123.

我已经测试过这种模式:

#\(.*"(.*)".*\)#

但它只匹配最后一个字符串123(我使用preg_match_all(),所以它应该返回每个结果,不是吗?)

如果我添加Ungreedy 选项,它只匹配第一个字符串France。所以我不明白为什么没有 U 选项它不是贪婪的,有没有办法在引号和括号中获取我的字符串?

谢谢,拉斐尔 N。

4

3 回答 3

0

这应该适合你:

\("([^"]+)".+?"(.+)"

解释:

\("- 匹配括号和双引号

([^"]+)"- 捕获双引号内的所有内容

.+?"- 匹配任何内容到下一个双引号

(.+)- 捕获不是双引号的所有内容

"- 匹配最后一个双引号

只要您的示例数据与给定的完全相同,正则表达式就可以工作

于 2013-11-12T11:51:56.460 回答
0

我可以让它工作的唯一方法是使用:

$subject = 'My 00123450 "Ralph" ("France" is my country, "123" my age, ... , "an other text", ...)';

$pattern =  '/\((?:[^"\)]*"(.*?)")?(?:[^"\)]*"(.*?)")?(?:[^"\)]*"(.*?)")?[^"]*?\)/';
preg_match_all($pattern, $subject, $matches);

for ($i = 1; $i < count($matches); $i++)
{
    print($i.': '.$matches[$i][0].";\n");
}

输出:

1: France; 
2: 123; 
3: an other text;

该正则表达式仅适用于一组括号内最多出现3 次“引用字符串”。但是,您可以扩展正则表达式字符串以获取最多N 次出现,如下所示:

在每组括号中查找 1 到 N 个带引号的字符串的正则表达式是:

n=1 /\((?:[^"\)]*"(.*?)")?[^"]*?\)/
n=2 /\((?:[^"\)]*"(.*?)")?(?:[^"\)]*"(.*?)")?[^"]*?\)/
n=3 /\((?:[^"\)]*"(.*?)")?(?:[^"\)]*"(.*?)")?(?:[^"\)]*"(.*?)")?[^"]*?\)/

要查找 1-N 个字符串,请重复该部分(?:[^"\)]*"(.*?)")?N 次。对于每组括号中的 1-100 个字符串,您必须重复该部分 100 次 - 显然正则表达式将开始非常缓慢地评估。

我意识到这绝不是理想的,但它是我在一次通过解决方案方面的最大努力。

在 2 次通过中:

$subject = 'My name is "Ralph" ("France" is my country, "123" my age, ... , "an other text", ...)';

$pattern =  '/\(.*?\)/';
preg_match_all($pattern, $subject, $matches);

$pattern2 =  '/".*?"/';
preg_match_all($pattern2, $matches[0][0], $matches2);

print_r($matches2);

在 2 遍中产生正确的输出。急切地等待一个答案,显示如何在 1 中做到这一点。我已经尝试了我能想到的所有变体,但无法让它包含重叠匹配。

于 2013-11-12T13:42:56.267 回答
0

保持简单,分两步完成:

$s = 'My name is "Ralph" ("France" is my country, "123" my age) and "I" am. ';
$str = preg_replace('#^.*?\(([^)]*)\).*$#', '$1', $s);
if (preg_match_all('/"([^"]*)"/', $str, $arr))
   print_r($arr[0]);

输出:

Array
(
    [0] => "France"
    [1] => "123"
)
于 2013-11-12T11:46:53.120 回答