【问题标题】:Allow a new line anywhere in the regex?允许在正则表达式的任何地方换行?
【发布时间】:2023-03-06 11:24:02
【问题描述】:

我在一堆 RTF 文档中找到一个替换,我需要的基本模式是

\{(?:\\\*)?\\field\\fldlock\{\\\*\\fldinst ?MERGEFIELD ?((?:\\.*?)?[\w\[\]]+?)(?:\\.*?)?\}(?:\{\\fldrslt\})?\}

但是我后来发现每个斜杠之前可能有一个换行符,所以它变成了这个。

\{(?:\s*\\\*)?\s*\\field\s*\\fldlock\s*\{\s*\\\*\s*\\fldinst\s*MERGEFIELD\s*((?:\\.*?)?[\w\[\]]+?(?:\s*\\.*?)?)?\s*\}(?:\s*\{\s*\\fldrslt\s*\})?\s*\}

但后来我点击它失败了

fees totaling $\protect  {\field\fldlock{\*\fldinst MERGEFIELD ENTEROUTSTANDINGVETERINARYF
EES}}\plain\f0\fs24\prot

有没有办法让它在搜索的任何地方都匹配一个新行而不在任何地方添加(?:\r?\n)?

编辑

消除对新行的混淆。我需要在文档中保留换行符,如果它们在我的匹配项中,我只想删除它们,所以在我发布的最后一个示例中它应该替换

fees totaling $\protect  {\field\fldlock{\*\fldinst MERGEFIELD ENTEROUTSTANDINGVETERINARYF
EES}}\plain\f0\fs24\prot

fees totaling $\protect  ENTEROUTSTANDINGVETERINARYFEES\plain\f0\fs24\prot

【问题讨论】:

  • 有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。 - Jamie Zawinski,alt.religion.emacs,8/12/97
  • 有些人在遇到正则表达式时会想“我知道,我会使用我记得的引人入胜的引语”。现在他们没有在讨论中添加任何内容。 – Tomalak,SO, Jul 8 '09 at 14:27

标签: c# .net regex


【解决方案1】:

除非有人可以使用一些我不知道的正则表达式工具提供更好的答案,否则我可以通过将捕获组的搜索更改为来解决这个问题

(\\.*?)?([\w\[\]]+)(\s+\w+)?(\s*\\.*?)

我现在必须使用四个捕获而不是一个,(这也给了我一组实际打印文本的两个捕获组,无论如何我以后都需要。

【讨论】:

    【解决方案2】:

    也许您可以在运行其余的处理逻辑之前尝试Regex.Replace(yourString, "[\r\n]*", "")

    【讨论】:

    • 正如我在另一个答案中所说,我需要在正则表达式中保留不匹配的换行符。我会更新主帖。
    【解决方案3】:

    我认为你应该改用\s+

    编辑:如果您想用一个空格替换所有换行符(和其他奇怪的空格),只需在进行其他匹配之前运行以下命令:

    text = Regex.Replace(text, @"\s+", " ");
    

    【讨论】:

    • 好的,但是如何让它匹配最后一个在单词中间有换行符的例子(并让它在过程中删除换行符)。
    • 问题是我确实想保留一些换行符,如果它们在比赛中,我只是不想保留它们。您的解决方案将删除整个文档中的所有换行符。
    • RegexOptions.Singleline\s 没有影响,仅对. 有影响。
    • @Kobi,嗯,我不知道,已修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 2012-10-09
    相关资源
    最近更新 更多