如何确保分隔符之间的完整字符串符合正则表达式模式?
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;”怎么样例如? @JvdV1-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,这是因为粘贴这些值时的尾随空格。如果您想允许尾随空格,您可以在结束字符串锚点之前添加一个可选空格。以上是关于如何确保分隔符之间的完整字符串符合正则表达式模式?的主要内容,如果未能解决你的问题,请参考以下文章