正则表达式 - 每行匹配单个 instance/occurrence 个字符

Regex - Match a single instance/occurrence of a character per line

我真的不明白如何只匹配空格或破折号的单个实例。我能够得到一些结果,但仍然无法得到想要的结果。我实际上已经尝试了 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\-])?'

测试 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) *******

基本上,我需要做的是去除空格并将多余的破折号转换为单个破折号。这就是为什么我认为我可以创建一个正则表达式来 select(获取索引)空格和额外的破折号(从第二个连续的破折号开始)并将它们替换为无('')。很抱歉造成混淆,很难说明问题和正确的方法。

所以主要目标反映在下面,我只是需要去掉黄色的:

我想你想要:

  • spaces 被替换为空
  • 多个破折号减少为一个破折号

这意味着任何匹配(space 或破折号)的正则表达式都必须有一个不同的替换值,具体取决于它是否匹配 space 或破折号。可能,但很烦人。

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

  • 一个或多个破折号在破折号之后被替换为空,前导破折号保持不变
  • space

这将是:

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

也就是说,(?<=-) 用于匹配将保留在字符串中的破折号的后视,-+ 用于它后面的一个或多个破折号(这些将被替换为空)。 | 或者。 \s一个白色space字符。