正则表达式 - 每行匹配单个实例/出现的字符

时间:2018-03-22 03:54:36

标签: regex powershell regex-lookarounds nsregularexpression

我真的无法得到如何只匹配空格或短划线的单个实例。我能够得到一些结果,但仍然无法获得所需的结果。我实际上已尝试过regexr.com的不同配置,但仍然无法让它工作。[regex padawan here]

Shell: Powershell
Data : "test--asd :45; wth---notcool:  69"

Index   0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32
Value   t   e   s   t   -   -   a   s   d       :   4   5   ;       w   t   h   -   -   -   n   o   t   c   o   o   l   :           6   9

测试1正则表达式= '([\s\-])\1?'

测试2正则表达式= '([\s\-]){1}'

Testing 1         Testing 2       Desired to be REMOVED 
Index   Value     Index Value     Index Value
-----   -----     ----- -----     ----- -----
4       --        4     -         5     -
9                 5     -         9 
14                9               14    
18      --        14              19    -
20      -         18    -         20    -
29                19    -         30        
                  20    -       
                  29            
                  30            

我认为我遗漏了一些非常基本的东西或基本的东西,但我的主要目标是我想使用正则表达式来基本上将空格和破折号减少到单个实例,以便字符串不会混乱。

******* EDIT (Added explanation) *******

基本上,我需要做的是摆脱白色空间并将冗余破折号转换为单个破折号。这就是为什么我认为我可以创建一个正则表达式来选择(获取索引)白色空格和额外的破折号(从第二个连续短划线开始)并将它们替换为空('')。对于困惑,难以陈述问题和正确的方法感到抱歉。

所以主要目标如下所示,我需要摆脱黄色的那些:

Final desired output

1 个答案:

答案 0 :(得分:3)

我想你想要:

  • 空格无需替换
  • 多个破折号缩减为单个破折号

这意味着匹配(空格或短划线)的任何正则表达式必须具有根据其是否与空格或短划线匹配而变化的替换值。可能,但很烦人。

相反,我会改写它以使替换值在两种情况下都相同 - 空字符串 - 这使得应该替换的东西:

  • 短划线后面的一个或多个短划线 被替换为空,前导短划线
  • 空间

这将是:

PS C:\> "test--asd :45; wth---notcool:  69" -replace '(?<=-)-+|\s'
test-asd:45;wth-notcool:69

也就是说,(?<=-)用于后视匹配将保留在字符串中的短划线,-+用于后面的一个或多个短划线(这些将被替换为空)。 |或。 \s一个空格字符。