DotAll和多线RegEx

mas*_*asi 4 html regex powershell powershell-3.0

我在Powershell中使用Rexex时遇到了一些麻烦.似乎有一个遗留错误或其他什么.

我想使用的文本是一个html文件,看起来像这样(Example1):

<span>[Mobile: %mobile% |] Phone: %telephone% [| Fax: %faxNumber%]</span>
<Span>
Run Code Online (Sandbox Code Playgroud)

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

<span>[Mobile: 

%mobile% |] Phone: %telephone% [| Fax: &nbsp;&nbsp;%faxNumber%]</span>
Run Code Online (Sandbox Code Playgroud)

如你所见,我们得到了换行符和html转义,修复了空格&nbsp;.

我的Powershell Regex看起来像这样:

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

还有这个

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

基本上[标记变量的开头和]结束.由此产生两个问题:

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

我很乐意为专业人士提供任何帮助甚至正则表达式的建议,以避免我现在没有考虑的任何进一步问题......

编辑:(例3):

<span>[Mobile: 

%mobile% |] Phone: %telephone% [| Fax: 
%faxNumber%]</span>
Run Code Online (Sandbox Code Playgroud)

Mar*_*der 9

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

为了解决这个问题,7你可以简单地禁止]在你想要匹配的那个之前关闭(顺便说一下,这也使得DotAll不再需要).所以像这样的东西应该适合你:

\[([^\]:]*)Fax([^\]]*)\]
Run Code Online (Sandbox Code Playgroud)

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

\[        # 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 ]
Run Code Online (Sandbox Code Playgroud)

进一步阅读角色类.

请注意,这些模式都不需要多线模式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>
Run Code Online (Sandbox Code Playgroud)