html - DotAll 和多行正则表达式

标签 html regex powershell powershell-3.0

我在 Powershell 中使用 Rexex 时遇到了一些麻烦。似乎存在实现错误或其他问题。

我要使用的文本是一个 html 文件,它看起来像这样(示例 1):

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

问题是,由 html 编辑器引起,我也可能得到类似这样的结果(示例 2):

<span>[Mobile: 

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

如您所见,我们得到了换行符和 html 转义,修复了空格  

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

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

还有这个

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

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

  1. 因为我们有两个变量,手机和传真,我使用 (.?){7} 来允许一些(这里正好是 7 个)字符并避免匹配 之间的空洞部分第一个 [Mobile 附近和 最后一个 ] Fax 附近(如果我使用 (. *?) 而不是 (.?){7})。我不确定是否有其他选择,以便我可以在起始 [ 和变量关键字“传真”之间允许任意数量(而不是 7 个)的字符。当添加    之类的东西时,这将有助于避免错误匹配(其中只有 7 个字符是不够的,就像我说的那样 (.*?) 会失败).希望我能够解释清楚(有点难)- 如果没有:请随时提问!
  2. Powershells -replace 方法不提供设置正则表达式选项的方法,因此我必须使用 (?ms) 来设置 DotAll 和多行模式。如您所见,我在我的正则表达式模式中使用它。但是:当添加换行符时,如您在示例 2 中所见 Mobile:%mobile% 之间,正则表达式失败,没有任何东西被替换!

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

编辑: (示例 3):

<span>[Mobile: 

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

最佳答案

DotAll 模式的诀窍是使用 [\s\S] 而不是 .。此字符类匹配任何 字符(因为它匹配空格和非空格字符)。 (与 [\w\W][\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 ]

Further reading on character classes.

请注意,这些模式都不需要多行模式 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>

关于html - DotAll 和多行正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13674201/

相关文章:

azure - 获取-AzDenyAssignment : 'directoryObjectId' cannot be null

powershell - 自动化配置SQL Server 2017 Reporting Services

PowerShell Hashtable 显示第一个键

Javascript 正则表达式去除选择性 html 标签

底部和顶部页面的 HTML 链接

html - 悬停在不透明度下无法正常工作

删除字符串的开头和结尾,直到在 R 中找到一个模式

python - 更好地使用 re 来避免重复传递

html - float 导航的问题

regex - 将wordpress YouTube标签转换为嵌入的对象