【问题标题】:Regular expression for finding letters before or after a certain letter用于查找某个字母之前或之后的字母的正则表达式
【发布时间】:2016-07-15 14:11:42
【问题描述】:

我在 PHP 中有以下数组:

$words = array("apple", "banana", "lemon");

我想搜索一个单词,它与以下配置文件匹配:

  • 第一个字母可以是任何东西a-z
  • 第二个字母必须与第一个字母相同或在第一个字母之后(即,如果第一个字母是 p,则第二个字母必须是 p 或在字母表中之后)
  • 第三个字母必须与第二个字母相同或之后
  • 第四个字母必须在第三个字母之前
  • 第五个字母必须在第四个字母之前

有没有办法创建一个可以匹配上述条件的正则表达式?这将是最好的,因为我也希望在 MySQL 中创建一个实现,因此正则表达式将更适合新情况。

【问题讨论】:

  • 我创建了以下内容,并且它只在第三个字母之前有效。第 4 和第 5 有错误。希望你能看到我正在尝试做的逻辑......DEMO
  • 您可以使用ord() like in this demo 来比较ASCII values。在 MySQL 中可以添加 custom functions,但这可能需要一些努力。使用 MySQL 正则表达式,我认为这是不可行的。

标签: php mysql regex string


【解决方案1】:

我想出了一个不使用 RegEx 的方法,但是您的条件仍然会匹配:

function my_func($str) {
    $letters = 'abcdefghijklmnopqrstuvwxyz';

    $match = true; // Will be set to false if does not match conditions

    $l1pos = strrpos($letters, $str[0]);
    $l2pos = strrpos($letters, $str[1]);
    $l3pos = strrpos($letters, $str[2]);
    $l4pos = strrpos($letters, $str[3]);
    $l5pos = strrpos($letters, $str[4]);

    // If letter 2 comes before letter 1
    if ($l2pos < $l1pos) { $match = false;}

    // If letter 3 comes before letter 2
    if ($l3pos < $l2pos) { $match = false; }

    // If letter 4 comes after letter 3
    if ($l4pos >= $l3pos) { $match = false; }

    // If letter 5 comes after letter 4
    if ($l5pos >= $l4pos) { $match = false; }

    return $match;
}

你可以这样使用它:

$string = 'apple';

if (my_func($string)) {
    print 'Matched!';
}
else {
    print 'Not Matched. :(';
}

如果你想让函数变得非常小,你可以使用以下:

function my_func($str) {
    $letters = 'abcdefghijklmnopqrstuvwxyz';
    $match = true;
    function m($i) {
        return strrpos($letters, $str[$1]);
    }
    if ((m(1) < m(0)) || (m(2) < m(1)) || (m(3) >= m(2)) || (m(4) >= m(3))) {
        $match = false;
    }
    return $match;
}

我也尝试过 RegEx,得到以下结果:

^([a-z])    # First Letter
([\1-z])    # Second Letter
([\2-z])    # Third Letter
([a-\3])    # Fourth Letter
([a-\4])    # Fifth Letter

但是,您不能在将az 动态设置为先前捕获的组之一时使用a-z。您可以使用 PHP 连接来创建 RegEx,但这需要至少 4 行代码,除了第一个字母之外的每个字母。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多