正则表达式匹配([^>((),] +)但包含一些\ w?

时间:2010-11-29 12:07:04

标签: php regex

我正在使用php的preg_replace函数,我有以下正则表达式:

(?:[^>(),]+) 

匹配除>(),之外的任何字符。问题是我想确保其中至少有一个字母(\w)且匹配不为空,我该怎么做?

有没有办法在[^>(),]+部分说出我想要匹配的内容?

3 个答案:

答案 0 :(得分:1)

您可以添加lookahead assertion

(?:(?=.*\p{L})[^>(),]+)

这可确保字符串中的某处至少有一个字母(\p{L}; \w也匹配数字和下划线。

但是,您并不需要(?:...)非捕获括号:

(?=.*\p{L})[^>(),]+

同样适用。另外,为了确保我们始终匹配整个字符串,最好用锚点包围正则表达式:

^(?=.*\p{L})[^>(),]+$

编辑:

对于在比赛中不包括周围空白的附加要求,事情会变得复杂一些。尝试

^(?=.*\p{L})(\s*)((?:(?!\s*$)[^>(),])+)(\s*)$

在PHP中,例如,用REPLACEMENT替换我们找到的所有字符串,只留下前导和尾随空格,这可能如下所示:

$result = preg_replace(
    '/^          # Start of string
    (?=.*\p{L})  # Assert that there is at least one letter
    (\s*)        # Match and capture optional leading whitespace  (--> \1)
    (            # Match and capture...                           (--> \2)
     (?:         # ...at least one character of the following:
      (?!\s*$)   # (unless it is part of trailing whitespace)
      [^>(),]    # any character except >(),
     )+          # End of repeating group
    )            # End of capturing group
    (\s*)        # Match and capture optional trailing whitespace (--> \3)
    $            # End of string
    /xu', 
    '\1REPLACEMENT\3', $subject);

答案 1 :(得分:0)

您只需在\w内“插入”(?:[^>(),]+\w[^>(),]+)即可。所以它至少会有一个字母,显然不是空的。 BTW \w捕获数字和字母。如果您只想要字母,则可以使用unicode字母字符类\p{L}而不是\w

答案 2 :(得分:0)

这个怎么样:

(?:[^>(),]*\w[^>(),]*)