需要否定这种正则表达式模式,但不知道如何

时间:2010-07-01 17:32:11

标签: php regex preg-match

我找到了一个PHP的正则表达式模式,可以完成我所需要的完全对立,我想知道如何反转它?

假设我有以下文字:Item_154 ($12)

这个模式/\((.*?)\)/得到了括号内的内容,但我需要得到“Item_154”并删除括号内的内容和括号前的空格。

有人知道我该怎么做吗?

显然,正则表达式在我头顶......

7 个答案:

答案 0 :(得分:4)

/^([^( ]*)/

匹配从字符串开头到第一个空格或(的所有内容。

如果您需要匹配的项目中可以包含空格,并且想要在括号之前删除空格,那么您可以改为使用它:

/^([^(]*?)\s*\(/

答案 1 :(得分:2)

以下内容将匹配任何看似text (...)的内容,但只返回匹配中的text部分。

\w+(?=\s*\([^)]*\))


说明:
\w包含字母数字和下划线,+表示匹配一个或多个 (?= )组是积极向前看,说“确认存在但不匹配” 然后我们有空格\s*零或更多 \(\)与文字()字符匹配(因为它通常是特殊聊天)。
[^)]是非字符字符,*为零或更多

希望一切都有意义吗?

答案 2 :(得分:1)

/(.*)\(.*\)/

什么不在()现在将是你的第一场比赛:)

答案 3 :(得分:1)

真正帮助过我的一个网站是http://gskinner.com/RegExr/

它可以让你构建一个正则表达式,然后粘贴一些示例目标/文本来测试它,突出显示匹配。所有可能的正则表达式组件都在右侧列出(基本上)描述函数的工具提示。

答案 4 :(得分:0)

<?php
$string  = 'Item_154 ($12)';
$pattern = '/(.*)\(.*?\)/';

preg_match($pattern, $string, $matches);

var_dump($matches[1]);
?>

应该让你Item_154

答案 5 :(得分:0)

如果有帮助,以下正则表达式适用于您的字符串作为替换? : -

\ S * \(。*?\)

以下解释了它在做什么......

空白,任意数量的重复 - \ s *

文字 - \(

任何字符,任意数量的重复,尽可能少 - 。*?

文字 - \)

我发现Expresso(http://www.ultrapico.com/)是学习/编写正则表达式的最佳方式。

HTH

答案 6 :(得分:0)

这是完成整个事情的一次性

$text = 'Item_154 ($12)';
$text = preg_replace('/([^\s]*)\s(\()[^)]*(\))/', $1$2$3, $text);
var_dump($text);
//Outputs: Item_154()

请记住,使用任何PCRE函数都需要相当大的开销,所以如果你在长循环中使用这样的东西并且文本很简单,那么你可以用substr / strpos做这样的事情然后连续最后的事情,因为你知道他们应该是空的。

也就是说,如果您希望学习REGEX并提高效率,我建议您查看:http://rexv.org 我发现那里的PCRE工具非常有用,虽然它在某些方面可能很古怪。特别是,您使用的任何示例应尽可能使用单引号,因为它不能正确使用双引号。

另外,为了真正掌握如何使用正则表达式,我会查看Jeffrey Friedl的Mastering正则表达式ISBN-13:978-0596528126 由于您使用的是PHP,我会尝试获得第3版,因为它有专门针对PHP PCRE的部分。请务必先阅读前6章,因为它们为您提供了处理该特定章节中材料所需的基础。如果你看到第二版便宜的地方,这几乎是相同的核心材料,所以它也是一个很好的购买。