php正则表达式在括号内查找文本

时间:2014-04-14 14:19:26

标签: php regex powershell

使用PHP或Powershell我需要帮助在文本file.txt中查找文本,在括号内输出值。

示例:

file.txt看起来像这样:

This is a test I (MyTest: Test) in a parenthesis
    Another Testing (MyTest: JohnSmith) again. Not another testing testing (MyTest: 123) 

我的代码:

$content = file_get_contents('file.txt'); 
   $needle="MyTest"
preg_match('~^(.*'.$needle.'.*)$~', $content, $line);

输出到新文本文件将是:

123Test, JohnSmith,123,

2 个答案:

答案 0 :(得分:7)

使用此模式:

~\(%s:\s*(.*?)\)~s

请注意,此处的%s不是实际模式的一部分。它被sprintf()用来替换作为参数传递的值。 %s代表字符串,%d代表有符号整数等。

<强>解释

  • ~ - 开始分隔符
  • \( - 匹配文字(
  • %s - $needle
  • 的占位符
  • : - 匹配文字:
  • \s* - 零个或多个空白字符
  • (.*?) - 匹配(并捕获)括号内的任何内容
  • \) - 匹配文字)
  • ~ - 结束分隔符
  • s - pattern modifier使.也匹配换行符

<强>代码:

$needle  =  'MyTest';
$pattern = sprintf('~\(%s:\s*(.*?)\)~s', preg_quote($needle, '~'));
preg_match_all($pattern, $content, $matches);
var_dump($matches[1]);

<强>输出:

array(3) {
  [0]=>
  string(4) "Test"
  [1]=>
  string(9) "JohnSmith"
  [2]=>
  string(3) "123"
}

Demo

答案 1 :(得分:0)

这是一个Powershell解决方案:

@'
This is a test I (MyTest: Test) in a parenthesis
    Another Testing (MyTest: JohnSmith) again. Not another testing testing (MyTest: 123) 
'@ | set-content test.txt


([regex]::Matches((get-content test.txt),'\([^:]+:\s*([^)]+)')|
 foreach {$_.groups[1].value}) -join ','

Test,JohnSmith,123

你可以在完成后添加那个尾随逗号,如果你确实想要那个......