我已经杀了几个小时仍然无法正确使用正则表达式 - 我将非常感谢您对此的帮助。
我需要匹配参数之间的所有单词,其中要选择的单词是最少两个单词,由两个参数之间的至少一个空格分隔(参数是以短划线开头的任何单词:-ParamName
)以下字符串中的示例:
Start-WinJob -ParamOne paramValue -ParamTwo
的 val1 val2 val3
-ParamThree
的 val1 val2 val3 valN
我需要一个正则表达式来匹配:
val1 val2 val3
和
val1 val2 val3 valN
更新
我正在使用PowerShell,此代码段将在控制台上打印匹配项:
$pattern = "(?<= )\w+ [\w ]+" # referring to answeres below -> reset match using `\K` is not recognised in PowerShell implementation and errors
$text = "Start-WinJob -ParamOne paramValue -ParamTwo val1 val2 val3 -ParamThree val1 val2 val3 valN"
$text | Select-String $pattern -AllMatches |
% {$_.Matches} |
% {$_.Value}
伙计你很棒我发现很难选择答案......
我想抛出一些额外的复杂性,我希望你喜欢它 - 匹配的值是语音句子。我很遗憾我的疏忽,但我需要迎合标点符号的问题。基本上这些字符中的任何一个:€£$.%¬|@:?/,'#<>``&![]=-_)(*+
都可以出现在值中,并且不应该破坏值\单词的匹配,另外还应该忽略重复双引号""
更新了测试字符串:
Start-WinJob -ParamOne paramValue -ParamTwo
的 val1 val2 val3
-ParamThree
的 escape values: €£$.%¬|@?/,'#<>\``&![]=-_)(*+ lastVal
答案 0 :(得分:1)
由于您还没有指定语言,我只假设正则表达式 。
-\w+\s+\K\w[\w\s]*(?=\s+-|$)
Start-WinJob -ParamOne paramValue -ParamTwoval val val3 -ParamThree val1 val2 val3 valN
paramValue
val val3
val1 val2 val3 valN
-\w+\s+
按字面匹配-
,后跟至少一个字符(a-zA-Z0-9_
),后跟至少一个空白字符\K
重置报告的匹配的起点(任何以前消费的字符不再包含在最终匹配中)\w[\w\s]*
匹配任何单词字符一次,然后匹配任何单词字符或空格字符(?=\s-|$)
肯定后面的正面预测是一个或多个空格字符,后面跟着-
字面意思,或行尾-\w+\s+\K(?:(?=\w+\s+\w)\w[\w\s]*)(?=\s+-|$)
同样,上面的代码只检查后面的内容是否包含任何单词,后跟一个空格,后跟任何单词字符,以确保至少存在两个参数。
-\w+\s+\K\w+\s+[\w\s]*(?=\s+-|$)
bulbus在下面评论中建议的第一次编辑的简短示例。
答案 1 :(得分:1)
假设您可以使用lookbehind,这可以非常简单:
(?<= )\w+ [\w ]+
https://regex101.com/r/Yqaajy/8
(?<= )
断言模式前面有一个空格。
\w+
- 一个或多个单词字符,后跟空格。
[\w ]+
- 还有一个字符或空格。