4

我在 Powershell 中使用 Rexex 时遇到了一点麻烦。似乎有一个实施错误或什么的。

我要使用的文本是一个 html 文件,如下所示(Example1):

<span>[Mobile: %mobile% |] Phone: %telephone% [| Fax: %faxNumber%]</span>
<Span>

问题是,由 html 编辑器引起的,我也可能会得到这样的东西(Example2):

<span>[Mobile: 

%mobile% |] Phone: %telephone% [| Fax: &nbsp;&nbsp;%faxNumber%]</span>

如您所见,我们得到了换行符和 html 转义、固定空格&nbsp;

我的 Powershell 正则表达式如下所示:

$x = $x -ireplace '(?ms)\[(.?){7}Fax(.*?)\]', 'MyReplacement1'

还有这个

$x = $x -ireplace '(?ms)\[(.?){7}Mobile(.*?)\]', 'MyReplacement2'

基本上[标记变量的开头,]标记变量的结尾。由此产生两个问题:

  1. 由于我们有两个变量,移动和传真,我(.?){7}用来允许一些(这里正好是 7 个)字符并避免匹配第一个 [ 靠近Mobile最后一个 ] 靠近Fax之间的孔部分(如果我会使用会发生这种情况)(.*?)而不是(.?){7})。我不确定是否有替代方法,例如,我可以在起始 [ 和变量关键字“Fax”之间允许任意数量(而不是 7 个)字符。当添加诸如此类的内容时,这对于避免不匹配很有用&nbsp;&nbsp;(其中只有 7 个字符是不够的,就像我说的那样(.*?)会失败)。希望我能够解释它(有点难) - 如果没有:请随时提问!
  2. Powershells -replace 方法不提供设置正则表达式选项的方法,因此我必须使用 (?ms) 来设置 DotAll 和多行模式。如您所见,我在我的正则表达式模式中使用它。但是:当添加换行符时,正如您在示例 2中的Mobile:%mobile%之间看到的那样,正则表达式失败并且没有任何内容被替换!

我非常感谢专业人士的任何帮助甚至正则表达式建议,以避免我现在没有考虑的任何进一步问题......

编辑:(示例 3):

<span>[Mobile: 

%mobile% |] Phone: %telephone% [| Fax: 
%faxNumber%]</span>
4

1 回答 1

10

DotAll 模式的诀窍是使用[\s\S]而不是.. 这个字符类匹配任何字符(因为它匹配空格和非空格字符)。(与[\w\W]or一样[\d\D],但空格似乎是一种约定。)

为了解决这个问题,7您可以简单地禁止]在您真正想要匹配的那个之前关闭(顺便说一下,这也使得 DotAll 变得不必要)。所以这样的事情应该适合你:

\[([^\]:]*)Fax([^\]]*)\]

它看起来有点难看,但它只是意味着:

\[        # literal [
(         # capturing group 1
  [^\]:]* # match as many non-:, non-] characters as possible
)         # end of group 1
Fax       # literal Fax
(         # capturing group 2
  [^\]]*  # match as many non-] characters as possible
)         # end of group 2
\]        # literal ]

进一步阅读字符类。

请注意,这些模式m都不需要多行模式(你的和我的都不是),因为它所做的只是分别制作^$匹配行的开头和结尾。但是没有一个模式包含这些元字符。所以修饰符不做任何事情。

我的控制台输出:

PS> $x = "<span>[Mobile: %mobile% |] Phone: %telephone% [| Fax: &nbsp;&nbsp;%faxNumber%]</span>"
PS> $x -ireplace '\[([^\]:]*)Mobile([^\]]*)\]', 'MyReplacement1'
<span>MyReplacement1 Phone: %telephone% [| Fax: &nbsp;&nbsp;%faxNumber%]</span>
PS> $x -ireplace '\[([^\]:]*)Fax([^\]]*)\]', 'MyReplacement2'
<span>[Mobile: %mobile% |] Phone: %telephone% MyReplacement2</span>
于 2012-12-02T21:49:28.597 回答