【问题标题】:Regex stop Quantifer on True possible?正则表达式在 True 上停止 Quantifer 可能吗?
【发布时间】:2017-12-12 12:25:18
【问题描述】:

如果陈述为真,我想停止量词。有知道的吗?

XXXXXX,2017 年 9 月 20 日 XXX XXXXXXXXX XX MWSt。编号:CHE-XXX.XXX.XXX p.A. XXXXXX XXXXXX XXXXXX Rechnungs Nr.321 XX XXXXXX 32

XXXXXX, (?<Date>\d{2}.\s{1,}[A-z]{1,}\s{1,}\d{4})\s{1,}(?<CompanyName>.*)\n(?(?=Rechnungs Nr\.)Rechnungs Nr\.(?<BillNumber>\d{1,})|.*\n){1,}

我的目标是:

XXXXXX, (?<Date>\d{2}.\s{1,}[A-z]{1,}\s{1,}\d{4})\s{1,}(?<CompanyName>.*)\n(?(?=Rechnungs Nr\.)Rechnungs Nr\.(?<BillNumber>\d{1,})|.*\n){2}

你看这不是动态的,这就是问题所在。我想尽可能多地这样做。在某些情况下{2} 还不够。所以我选择{1,}。这里的问题是以下文本匹配。这对我很不利。我想在那个循环之后为其他文本序列做更多的循环。我只想匹配数字(在本例中为 321 )在此停止 if 条件之后。

提前谢谢你。

You can get Output here: Regular Expression

【问题讨论】:

  • 打扰一下,什么意思?请发布一些示例文本和预期输出。
  • 您好,感谢您的回答,我已经添加了一些描述。您可以单击添加的链接以获取输出 :)
  • @Staubi:你是说这个吗:regex101.com/r/AJAaa3/2
  • @Jan Perfect,非常感谢。你能描述一下吗? (?s:.*?) 看起来很奇怪^^

标签: c# regex


【解决方案1】:

根据我的评论(见demo on regex101.com):

XXXXXX,\s*
(?<Date>\d{2}.\s+[A-Za-z]+\s+\d{4})\s+
(?<CompanyName>.*)(?s:.*?)
Rechnungs\ Nr\.(?<BillNumber>\d+)

分解这句话:

XXXXXX,\s*                             # XXXXXX, followed by spaces
(?<Date>\d{2}.\s+[A-Za-z]+\s+\d{4})\s+ # your original expression
                                       # followed by at least one space

(?<CompanyName>.*)                     # rest of the line goes into
                                       # group CompanyName
(?s:.*?)                               # DOTALL, lazily
Rechnungs\ Nr\.(?<BillNumber>\d+)      # Rechnungs Nr.
                                       # followed by digits

抛开一些潜在的优化,主要思想是使用

(?s:.*?)

这会为组打开DOTALL 模式,这意味着在该组内,点匹配每个字符(包括换行符)。使用惰性量词 (.*?),它可以根据需要扩展,甚至可以跨越多行。

作为替代方案,您可以使用[\s\S]*?,它结合了空格而不是空格,最终导致所有字符。

旁注:\s{1,}\s+ 相同,\d{1,}\d+ 相同,[A-z] 包含更多字符,然后 [A-Za-z]

【讨论】:

  • 非常感谢,一些问题:我看到你使用标志 (x) 我不确定,在 c# 上工作吗?我尝试添加新的正则表达式,现在它不起作用。如果你在最后加上“Total inkl. MwSt. CHF 969.30”并得到 969.30,你会怎么做?感谢您的宝贵时间!
  • Bether 说,如何添加这个:Total inkl\。 MWSt\。 CHF(?\d+.\d{2}) :)
  • @Staubi:x 标志使表达式变得冗长,意味着表达式中的空格被忽略(并且您必须在表达式本身中显式转义它们)。它肯定适用于C#
  • 找到了。是的 x 标志适用于 c#。这个问题很抱歉。我从不使用标志,所以这让我有点困惑。
【解决方案2】:

我找到了又快又好的方法:

XXXXXX, (?<Date>\d{2}.\s+[A-z]+\s+\d{4})\s{1,}(?<CompanyName>.*)\n(?(?!Rechnungs Nr\.).*\n)Rechnungs Nr\.(?<BillNumber>\d+) 

You can get Output here: Regular Expression

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-29
    • 2010-11-17
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多