RegEx模式选择PowerShell参数之间的所有单词

时间:2017-09-28 20:57:12

标签: regex powershell

我已经杀了几个小时仍然无法正确使用正则表达式 - 我将非常感谢您对此的帮助。

我需要匹配参数之间的所有单词,其中要选择的单词是最少两个单词,由两个参数之间的至少一个空格分隔(参数是以短划线开头的任何单词:-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

2 个答案:

答案 0 :(得分:1)

答案

由于您还没有指定语言,我只假设正则表达式

代码

See this code in use here

-\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-|$)肯定后面的正面预测是一个或多个空格字符,后面跟着-字面意思,或行尾

修改

代码1

See code in use here

-\w+\s+\K(?:(?=\w+\s+\w)\w[\w\s]*)(?=\s+-|$)

同样,上面的代码只检查后面的内容是否包含任何单词,后跟一个空格,后跟任何单词字符,以确保至少存在两个参数。

代码2

See this code in use here

-\w+\s+\K\w+\s+[\w\s]*(?=\s+-|$)

bulbus在下面评论中建议的第一次编辑的简短示例。

答案 1 :(得分:1)

假设您可以使用lookbehind,这可以非常简单:

(?<= )\w+ [\w ]+

https://regex101.com/r/Yqaajy/8

(?<= )断言模式前面有一个空格。

\w+ - 一个或多个单词字符,后跟空格。

[\w ]+ - 还有一个字符或空格。