程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了正则表达式匹配任一字符串,要么是 int大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决正则表达式匹配任一字符串,要么是 int?

开发过程中遇到正则表达式匹配任一字符串,要么是 int的问题如何解决?下面主要结合日常开发的经验,给出你关于正则表达式匹配任一字符串,要么是 int的解决方法建议,希望对你解决正则表达式匹配任一字符串,要么是 int有所启发或帮助;

假设我们有以下字符串:

$a = 'a == 1';
$b = 'b == "1"';
$c = "c == '1'";
$d = "d == 'd'";

我想使用正则表达式匹配引号中的数字/元素,在以下情况下:

  • 如果我们没有(单引号或双引号),我们只能将(正)数字与数字匹配
  • 如果我们有引号,我们会匹配引号中的所有内容。

实际上,我的正则表达式是

((?<guillemet>"|\')(?<valeur>.*?)(\k<guillemet>)|(?<valeur_numerique>\d+)) 

所以我在结果数组中得到了三个键:'guillemet'、'valeur_numerique' 和 'valeur'。例如对于$a,我得到

array (
  0 => '1','guillemet' => '',1 => '','valeur' => '',2 => '',3 => '','valeur_numerique' => '1',4 => '1',)

是否应该可以简化正则表达式,以便直接获得 valeur,而不需要关注引号?也就是说,对于 $a,得到

array (
  0 => '1','valeur' => '1',)

无需自己编写任何类型的过滤。

解决方法

不要试图将其全部压成一个(子)模式。定义替代方案更容易。我通常会单独取消引用该值,但可以使用 J (PCRE2_DUPNAMES) 修饰符。它允许重复的组名。

$pattern = '(
  (?<literal>                
    (?:"(?<value>[^"]*)")|    # double quoted value
    (?:\'(?<value>[^\']*)\')| # single quoted value
    (?:(?<value>[+-]?\d+))    # signed Integer
  )
)xJ';
    
$examples = [
    'a == 1','b == "1"',"c == '1'","d == 'd'","some == other"
];

foreach ($examples as $examplE) {
    echo $example,"\n";
    if (preg_match($pattern,$example,$match)) {
        echo json_encode(
            array_filter($match,fn($key) => is_String($key),ARRAY_FILTER_USE_KEY),JSON_PRETTY_PRINT
        ),"\n";
    } else {
        echo "NO_MATCH\n";
    }
}

输出:

a == 1
{
    "literal": "1","value": "1"
}
b == "1"
{
    "literal": "\"1\"","value": "1"
}
c == '1'
{
    "literal": "'1'","value": "1"
}
d == 'd'
{
    "literal": "'d'","value": "d"
}
some == other
NO_MATCH

大佬总结

以上是大佬教程为你收集整理的正则表达式匹配任一字符串,要么是 int全部内容,希望文章能够帮你解决正则表达式匹配任一字符串,要么是 int所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:int