【问题标题】:Regex to match any character except trailing spaces正则表达式匹配除尾随空格以外的任何字符
【发布时间】:2012-05-26 11:07:25
【问题描述】:

我正在使用这个 /\([^\S\n]*(.*)[^\S\n]*\)/ 正则表达式来匹配括号内的内容,它工作得很好,除非有尾随空格,它匹配它们。

例如( test1 test2 ) 我想匹配test1 test2,但我匹配test1 test2_(我写了下划线,但它是尾随空格)。

知道如何从我的比赛中删除这个尾随空格吗?

我正在使用 PHP preg_replace 函数。

【问题讨论】:

  • 在尝试匹配之前为什么不直接preg_replace('/\s+$/','')? (对不起,如果语法不完全正确,我不是 PHPer。)

标签: php regex preg-replace whitespace


【解决方案1】:

试试这个

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

结果:

$reg = '/\(\s*([^)]+?)\s*\)/';

var_dump( preg_replace( $reg, '$1', "( test1 test2 )" ) );

//string(11) "test1 test2"

【讨论】:

  • 正是我想要的。谢谢!就一个问题,问号代表什么,是0还是一次?它如何与 1 或更多的 + 结合?
  • @umpirsky:它使量词 (+) 匹配最短的匹配,而不是最长的匹配(非贪婪/懒惰)。见regular-expressions.info/repeat.html
  • @umpirsky 它使前面的+ 不贪婪。在此处阅读有关贪婪的信息regular-expressions.info/repeat.html
  • 谢谢。我还有一个问题。这个正则表达式正在删除第一个右括号,我想要最后一个。示例 ( test1 t3() test2) 变为 test1 t3( test2) 而我想要 test1 t3() test2。用正则表达式可以实现吗?
  • 或者,如果输入字符串中有多个开/关括号,至少让正则表达式不修复任何东西。
【解决方案2】:

将表达式锚定到文本的末尾怎么样?

/\([^\S\n]*(.*)[^\S\n]*\)$/
                         ^

\) 后面没有空格。

【讨论】:

  • 我用你的正则表达式得到了同样的结果。你可以在这里测试它php.umpirsky.com。功能:preg_replace,正则表达式:/\([^\S\n]*(.*)[^\S\n]*\)$/,替换:\1,主题:( test1 test2 )。它在末尾为test1 test2 提供了我要删除的空间。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多