【发布时间】:2013-07-22 20:18:11
【问题描述】:
谁能帮我一个正则表达式模式来匹配并检查以下场景?我正在尝试匹配用返回字符分隔的文本。每行只能包含 3 位数字 (\d{3}),最多 100 行。
没关系:
123
456
789
这样不行:
123
123789
456
这样不行(注意中间和末尾的空行):
123
456
如果有任何建议和帮助,我将不胜感激。谢谢。
【问题讨论】:
谁能帮我一个正则表达式模式来匹配并检查以下场景?我正在尝试匹配用返回字符分隔的文本。每行只能包含 3 位数字 (\d{3}),最多 100 行。
没关系:
123
456
789
这样不行:
123
123789
456
这样不行(注意中间和末尾的空行):
123
456
如果有任何建议和帮助,我将不胜感激。谢谢。
【问题讨论】:
所以整个文件必须是这样的?那就试试吧
new Regex(@"\A(?:\d{3}\r?\n)*\z")
说明:
\A # Start of string
(?: # Match the following (non-capturing) group:
\d{3} # - three digits
\r?\n # - one CRLF or LF (linebreak)
)* # any number of times (0 or more)
\z # until the very end of the string
如果文件可能不以换行符结尾(从您的描述中不确定),您可以使用
new Regex(@"\A(?:\d{3}\r?$\n?)*\z", RegexOptions.Multiline)
这最初使换行符成为可选 (\r?\n?) 但通过将行尾 anchor $ 放置在 CR 和 LF 之间来确保在每个三个字符位之后都有一行结束,这就是 (奇怪).NET 认为它应该匹配。
【讨论】:
执行此操作的一种方法是简单地根据您的初始正则表达式 (\d{3}) 检查每一行。 另一种方法是将 \r \n 添加到您的正则表达式并允许重复
"(\d{3}\r?\n)*"
为了过滤掉case 3,你只需要添加开头和结尾来表明你想要匹配整个文件; (^ 指定开始,$ 指定结束)
"^(\d{3}\r?\n)*$"
【讨论】: