【问题标题】:RegEx pattern to select all words between PowerShell parameters用于选择 PowerShell 参数之间的所有单词的正则表达式模式
【发布时间】:2017-09-28 20:57:12
【问题描述】:

我已经杀死了几个小时,但仍然无法正确使用正则表达式 - 我将非常感谢您在这方面的帮助。

我需要匹配参数之间的所有单词,其中要选择的单词至少是两个单词,两个参数之间至少用一个空格分隔(参数是任何以破折号开头的单词:-ParamName),例如以下字符串:

Start-WinJob -ParamOne paramValue -ParamTwoval1 val2 val3-ParamThreeval1 val2 val3 valN

我需要一个正则表达式来匹配:

val1 val2 val3

val1 val2 val3 valN

更新:

我正在使用 PowerShell,这个 sn-p 将在控制台上打印匹配项:

$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}

你们太棒了,我发现很难选择答案... 我想抛出一些额外的复杂性,希望你喜欢它 - 匹配值是语音句子。我很抱歉我的遗漏,但我需要照顾标点符号。基本上这些字符中的任何一个:€£$.%¬|@:?/,'#&lt;&gt;``&amp;![]=-_)(*+ 可能存在于值中,并且不应破坏值\单词的匹配,此外重复的双引号 "" 也应被忽略

更新的测试字符串:

Start-WinJob -ParamOne paramValue -ParamTwoval1 val2 val3-ParamThreeescape values: €£$.%¬|@?/,'#&lt;&gt;\``&amp;![]=-_)(*+ lastVal

【问题讨论】:

  • 您打算在哪种语言或程序中使用此正则表达式模式?例如,Javascript 不支持lookbehind,因此可能会限制模式的功能。
  • 抱歉,我认为从标题中可以看出该语言 - 应该可以在 PowerShell 中使用。

标签: regex powershell


【解决方案1】:

假设你可以使用lookbehind,这可以很简单:

(?&lt;= )\w+ [\w ]+

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

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

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

[\w ]+ - 多一个单词字符或空格。

【讨论】:

  • @CAstin,谢谢你的回答我真的很喜欢你的简洁建议!我还更新了我想知道您是否可以建议更新模式的问题 - 感谢您的帮助!
【解决方案2】:

回答

简介

由于您没有指定语言,我将假设 任何事情都发生在正则表达式方面。


代码

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+-|$)

下面的 cmets 中 bulbus 建议的我第一次编辑的简短示例。

【讨论】:

  • \K +1 的伟大用法
  • 请注意,他/她不想匹配paramValue,因为它本身只是一个参数。
  • -\w+\s+\K\w+\s+[\w\s]*(?=\s+-|$) 更新了您的答案以符合 OP 的要求。 regex101.com/r/WAbGF2/8
  • @ctwheels,感谢您的全面回答!我还更新了我的问题以澄清语言的使用 - 很抱歉我在代码 sn-p 中使用了 CAstins 的模式 :) 我只是为了简洁而把它放在那里,但是我也增加了更多的复杂性 - 我感谢你的帮助!跨度>
  • @ctwheels,不幸的是,重置匹配在 PowerShell 中不起作用,我得到:Select-String : The string -\w+\s+\K\w+\s+[\w\s]*(?=\s+-|$) is not a valid regular expression: parsing "-\w+\s+\K\w+\s+[\w\s]*(?=\s+-|$)" - Unrecognized escape sequence \K. 你可以在更新的答案中使用我的脚本 sn-p 来重现!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 2017-11-18
  • 1970-01-01
  • 2015-08-13
相关资源
最近更新 更多