【问题标题】:RegEx replace/remove all periods inside bracketsRegEx 替换/删除括号内的所有句点
【发布时间】:2016-08-20 05:55:31
【问题描述】:

我的 MDX 数据格式如下:

[Measures].[Gross Revenue(Exl. Post-Or Disc.)]

而我的拆分逻辑将这些拆分分组(例如 Arr('[Measures]', '[Gross Revenue(Exl. Post-Or Disc.)]')目前正挂在缩写部分上。当然不是完美,但最简单的处理方法是删除括号内的所有句点。

我目前的正则表达式:

RegExReplace('[Measures].[Gross Revenue(Exl. Post-Or Disc.)]', '\[(.*?)\]', '', 1)

目前正在给我:

.

理想情况下,应该如下所示:

[Measures].[Gross Revenue(Exl Post-Or Disc)]

我对正则表达式非常糟糕,无法弄清楚如何在我的一生中摆脱这段时间,所以任何指点都将不胜感激-谢谢!

【问题讨论】:

  • 使用'\.(?=[^][]*])'。是AHK吗?
  • 您使用哪种语言(RegExReplace,...)?
  • 如果是AHK,那么就是PCRE。还有一个花哨的 PCRE 正则表达式,以确保我们确实排除了 .s 内的匹配 [...]: (?:^[^[]*|][^[]*$|][^][]*\[)(*SKIP)(*FAIL)|\.
  • @WiktorStribiżew 我对 RegEx 的了解还不够,无法知道所有的替代方案,但是您的第一个表达式对我来说非常有用-谢谢!我希望您将其作为答案提交!
  • @trincot 我应该提前声明——我正在使用 C# 的 RegEx 类。

标签: regex


【解决方案1】:

句点.实际上是正则表达式中的一个特殊字符,意思是“任何字符”。要将特殊字符用作文字,您必须“转义”它。通常转义字符是反斜杠\

如果这个表达式解决了你的问题,请告诉我:

(?<!\])\.(?!\[)

这个表达式分为三个部分:

  1. (?&lt;!\]) ← 否定后向表示“前面没有右括号”
  2. \.←字面句号
  3. (?!\[) ← 负前瞻意思是“后面没有开括号”

在普通语言中,按 2、1、3 的顺序阅读这些句号是有意义的:句点前面没有右括号,也没有后括号。

有关正则表达式的更多信息,请参阅regular-expressions.info,尤其是有关“lookaheads”和“lookbehinds”的此页面:http://www.regular-expressions.info/lookaround.html

如果你想要更多的练习,这个网站有一个很好的界面来测试和尝试正则表达式:https://regex101.com/

【讨论】:

  • 这对我来说效果很好!感谢您分解每个部分并提供这些有用的资源。我一直在愚蠢地尝试通过https://regexcrossword.com/ 学习。绝对比用作学习资源更好。
  • 我很高兴!我在这里是一个相对较新的贡献者。对我来说,这是与互联网上的人联系的一种有趣且富有成效的方式。祝你有美好的一天!
  • 在测试 .NET regex 时不要依赖 regex101 ,该站点不支持 .NET regex 语法。使用 Ultrapico Expresso 工具。此外,在字符类之外转义 ] 是没有意义的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 2016-12-08
  • 2022-11-03
  • 1970-01-01
  • 2021-12-02
  • 2013-12-26
  • 2023-03-13
相关资源
最近更新 更多