使用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,
答案 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"
}
答案 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
你可以在完成后添加那个尾随逗号,如果你确实想要那个......