【问题标题】:regex matching characters AROUND a character, AND operator in regex?正则表达式匹配字符周围的字符,正则表达式中的AND运算符?
【发布时间】:2021-08-14 20:30:15
【问题描述】:

在正则表达式方面我并没有那么令人印象深刻......

我试图匹配一个单词中除了第二个字符之外的所有字符。

我想匹配 '&' 和 'uml' 但不是字符串中的第二个字符。

示例字符串:

&auml &zuml &ouml &euml

我想出了以下两个正则表达式。

这个匹配“uml”除了第一个字符(&):

(?=.)uml --> https://regex101.com/r/yrhzSU/1

这匹配除最后 3 个 (uml) 之外的第一个字符

&(?=.) --> https://regex101.com/r/LgRtd3/1

您认为将这些组合起来很容易,但我正在努力寻找任何类型的 AND 运算符。我可以使用 OR (|) 运算符,但它也可以匹配不严格以 '&' 开头并以 'uml' 结尾的字符串。

&(?=.)uml 

使用 OR 组合链接到正则表达式:https://regex101.com/r/MuhxM9/1

【问题讨论】:

  • 你可以做的是使用 2 个捕获组而不是 (&)[aeoz](uml) regex101.com/r/tIXxHk/1
  • 嗨@Thefourthbird,我相信这个表达式也会匹配第二个字符。我正在尝试匹配第一个字符 (&) 和字符 3,4 和 5。不过,您可能让我朝着正确的方向前进,我会尝试使用它。谢谢!
  • 它确实匹配第二个字符,但你不能在这样匹配时真正跳过一个字符。这样你就有了 2 个捕获组。
  • 您将如何处理捕获的数据?如果您只是输出它并且保证&,则在输出时手动添加& 前缀。如果 & 可以是 $ 之类的其他名称,那么您需要使用捕获组并将组 1 连接到组 2,每个 @Thefourthbird 的示例。
  • 嗨@MonkeyZeus,我的目标是使用-replace 来删除这些匹配的字符,例如我想将“&aum”变成“a”

标签: regex


【解决方案1】:

结合使用积极的前瞻和后瞻,我相信您可以实现这一目标

&(?=.uml)|(?<=&.)uml

Regexr

解释:

  • &amp;(?=.uml) 匹配 &amp; 后跟 .uml 但不包括 .uml 匹配
  • (?&lt;=&amp;.)uml 匹配 &amp;.(不包括在匹配中,因为它在后视中)后跟 uml

希望这会有所帮助

编辑:我删除了@The fourth bird 指出的不必要的捕获组

【讨论】:

  • 请注意,您不需要捕获组,您可能会使模式更具体&amp;(?=[aeoz]uml\b)|(?&lt;=&amp;[aeoz])uml\b
【解决方案2】:

关于您尝试过的模式:

  • 使用(?=.)uml 将始终匹配uml,因为正向前瞻断言直接在右侧的是任何字符(即u,因此您可以省略前瞻)
  • 使用&amp;(?=.) 匹配与号,并断言右边有任何字符
  • 使用&amp;(?=.)uml 将不会匹配任何内容,因为前瞻是一个非消耗性断言,并且断言(不匹配)uml 之前的字符)

如果要进行替换,请将&amp;aum 转换为a 而不是使用环视,您可以匹配与号,捕获a e oz 中的1 个使用字符类在第 1 组中并匹配以下放大器

在替换使用捕获组 1 保留您捕获的内容。

&([aeoz])uml\b

查看regex demo

【讨论】:

    猜你喜欢
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 2014-05-06
    • 2012-06-05
    • 2013-12-25
    相关资源
    最近更新 更多