正则表达式用于捕获括号中的单词

时间:2019-05-23 21:21:53

标签: php regex string preg-match-all regex-group

这是我的正则表达式:

/(\(-caramel-\)|\(-vanilla-\)|)/

使用此正则表达式,它将仅检测到第一 字符串,该字符串仅(-caramel-)

如何检测字符串中的所有(-caramel-)和(-vanilla-)?

这是我的示例字符串:

(-caramel-) John Cina (-vanilla-)(-caramel-)2019-05-19 07:31:05(-vanilla-)

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

如果我们希望在搜索中输入拼写错误的单词,则可以使用以()从左到右为界限的字符列表来实现,也许类似于:

\([carmel-]+\)|\([vanila-]+\)

enter image description here

DEMO

RegEx

如果不需要此表达式,可以在regex101.com中对其进行修改或更改。

RegEx电路

jex.im可视化正则表达式:

enter image description here

测试

$re = '/\([carmel-]+\)|\([vanila-]+\)/m';
$str = '(-caramel-) John Cina (-vanilla-)(-caramel-)2019-05-19 07:31:05(-vannila-)';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

// Print the entire match result
var_dump($matches);

演示

此代码段仅显示表达式是否有效:

const regex = /\([carmel-]+\)|\([vanila-]+\)/gm;
const str = `(-caramel-) John Cina (-vanilla-)(-caramel-)2019-05-19 07:31:05(-vannila-)`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}