如何确保分隔符之间的完整字符串符合正则表达式模式?

Posted

技术标签:

【中文标题】如何确保分隔符之间的完整字符串符合正则表达式模式?【英文标题】:How to make sure the complete string between a delimiter fits a regex pattern? 【发布时间】:2021-02-17 12:16:27 【问题描述】:

我想创建一个正则表达式模式,它将验证分隔符 ; 之间的编号。这意味着允许以下示例:

1; 2;3;4; 5; 
1-10; 11 - 20; 21- 30;31-40;41-50; 51-60;
a; b;c;d; e; f;
a - c; d-g;h-m;n-s; t - z; 

以下是不允许的:

asdf; 
1-c;
a - 10;
@ - *; 
+; 
1 - 10+;
\\ and so on

到目前为止,我已经想出了以下正则表达式模式:

\s*((\b\w\b)|(\b\w\b)\s*\-\s*(\b\w\b)|(\d+)|(\d+)\s*\-\s*(\d+));\s*

但是,如果我测试例如a - 10;,它会将 10; 标记为有效结果。因此,问题是,我如何强制分隔符内的完整字符串必须符合给定的模式,而不仅仅是其中的一部分?

附加问题: 是否可以在范围情况下(包含- 的模式)检查第二个数字是否高于第一个/第二个字符在字母表中是否比第一?到目前为止,我只能找到静态数字的检查。

【问题讨论】:

“1-10;a-b;”怎么样例如? @JvdV 1-10;a-b; 应该是有效的。 我有一个答案,但您现在有包含逗号的示例数据。这是故意的还是错字? OH sh..,是的对不起,是一种类型,将立即编辑! 【参考方案1】:

看起来你可以使用:

^(?: ?(?:\d+(?: ?- ?\d+)?|[a-z](?: ?- ?[a-z])?);)+$

在线查看demo

^ - 开始字符串锚点。 (?: - 打开第一个非捕获组: ? - 可选空格。 (?: - 打开第二个非捕获组: \d+ - 1 位以上 (?: - 打开第三个非捕获组: ?- ?\d+ - 一个可选空格、一个破折号和另一个可选空格,后跟 1 个以上的数字。 )? - 关闭第 3 个非捕获组并将其设为可选。 | - 或者: [a-z] - 范围从 a-z 的字符。 (?: - 打开第 4 个非捕获组: ?- ?\d+ - 一个可选空格、一个破折号和另一个可选空格,后跟一个范围从 a-z 的字符。 )? - 关闭第 4 个非捕获组并将其设为可选。 ); - 关闭第二个非捕获组并匹配分号。 )+ - 关闭第一个非捕获组并使其匹配 1 次以上。 $ - 结束字符串锚。

我不知道您是否想检查正则表达式中的更高/更低,或者是否有可能(我对此表示怀疑)。

【讨论】:

我觉得差不多就是这样,但是由于某种原因,它没有检测到 1; 2;3;4; 5; 1; 2-10; a; x; x;b - c; 上的匹配项,但老实说,我只是将它们粘贴进去,我'必须仔细阅读您的解释才能了解发生了什么。 @RolandDeschain,这是因为粘贴这些值时的尾随空格。如果您想允许尾随空格,您可以在结束字符串锚点之前添加一个可选空格。

以上是关于如何确保分隔符之间的完整字符串符合正则表达式模式?的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 正则表达式

Linux 学习笔记——正则表达式

正则表达式

正则表达式

正则表达式

linux:正则表达式grep命令