正则表达式多重匹配子字符串

标签 regex pcre

我有一个应用程序,可以根据给定的 perl 正则表达式确定是否应显示下拉菜单或简单的输入字段。因此,我必须检查正则表达式模式的“外部形式”和子字符串。为此,我想出了几种解决方案。

给定输入模式“^(100|500|1000)$”,这应该会导致一个包含三个条目的下拉菜单:100、500 和 1000。我需要一个正则表达式来解析整个模式,以确定是否它是一个有效的列表,以及一个执行实际子字符串匹配的正则表达式,因为我不知道如何多次匹配一个子字符串。这是我的正则表达式模式:

^\^\((?:((?:[^\|]|\\\|)+)(?:\||(?:\)\$$)))+

稍微简化一下,因为这个正则表达式有点模糊:

^\^\((?:([\w\d]+)(?:\||(?:\)\$$)))+

这可行,但仅存储最后一个子字符串(在给定情况下为 1000)并丢弃其余部分,使用 PCRE 和在线正则表达式工具进行测试。为了获取实际的子字符串,即下拉菜单字段,我有:

(?:\^\()?((?:[^\|]|\\|)+)(?:\||(?:\)\$$))

再次简化:

(?:\^\()?([\w\d]+)(?:\||(?:\)\$$))

这与子字符串匹配,但与其他正则表达式所做的下拉菜单模式语法不匹配(例如,该正则表达式也将“^(100|”与子字符串“100”匹配)。 我的问题是:有没有一种方法可以将这些正则表达式组合起来,只得到一个模式来匹配 1) 整个模式语法和 2) 实际的子字符串?

提前致谢,

杰里米

P.S.:抱歉,如果这是显而易见的,但我今天对所有这些正则表达式感到非常困惑。

示例数据:

输入正则表达式:^(100|500|1000)$
语法OK!
匹配的子字符串:100、500、1000
=> 显示下拉菜单

输入正则表达式:^[0-9a-fA-F]+$
语法错误!
=> 显示常规输入字段

输入正则表达式:^(foo|bar)$
语法OK!
匹配的子字符串:“foo”,“bar”
=> 显示下拉菜单

输入正则表达式:^(foo|bar)[0-9]+$
语法错误!
=> 显示常规输入字段

最佳答案

您可以通过两个步骤来实现您的需求。

您可以使用此正则表达式来验证格式:

\^\(\w+(?:\|\w+)*\)\$

<强> Working demo

enter image description here

一旦验证了正确的字符串,您就可以使用如下函数:

$str = "^(100|500|1000|2000|3000)$";
$arr = preg_split ("/\W+/" , $str, -1, PREG_SPLIT_NO_EMPTY);
print_r($arr);

输出:

Array
(
    [0] => 100
    [1] => 500
    [2] => 1000
    [3] => 2000
    [4] => 3000
)

关于正则表达式多重匹配子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25370771/

相关文章:

php - 用 preg_match() 匹配括号

python - 在python中查找由重复字符组成的单词

javascript - Google Script 中的正则表达式匹配 = null,但适用于 JSFiddle/RegExr

新正则表达式 ('regex' , 'flags' ) 和/regex/flags 之间的 JavaScript 差异

php - 如何更改 PCRE 正则表达式认为多行模式下的换行符?

c++ - msvcrt.dll 和 pcre 库出错

我的查询字符串的正则表达式只匹配一个值

javascript - 匹配一个字符后跟另一个字符

regex - 在 Kotlin 中查找模式每次出现的位置

regex - 匹配特定句子之外的单词