用于在某个字母之前或之后查找字母的正则表达式

时间:2016-03-28 10:18:36

标签: php mysql regex string

我在PHP中有以下数组:

import java.util.Date;
import java.util.TimeZone;
import java.text.SimpleDateFormat;

public class Test {

    public static final SimpleDateFormat fDateTime = new SimpleDateFormat(
            "yyyy-MM-dd'T'HH:mm:ss");

    public static void main(String[] args) {

        String output = getFormattedDate("2016-03-1611T23:27:58+05:30");
        System.out.println(output);

    }

    public static String getFormattedDate(String inputDate) {

        try {
            Date dateAfterParsing = fDateTime.parse(inputDate);

            fDateTime.setTimeZone(TimeZone.getTimeZone("timeZone"));

            return fDateTime.format(dateAfterParsing);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

我想搜索一个单词,它与下面的个人资料相匹配:

  • 第一个字母可以是$words = array("apple", "banana", "lemon");
  • 第二个字母必须与第一个字母相同或在第一个字母后面(即如果第一个字母为a-z,则第二个字母必须为p或在字母后面<) / LI>
  • 第三个字母必须与第二个字母相同或在第二个字母之后
  • 第四个字母必须在第三个字母之前
  • 第五个字母必须在第四个字母之前

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

1 个答案:

答案 0 :(得分:6)

我想出了一种没有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

但是,在向以前捕获的群组之一动态设置a-za时,您无法使用z。你可以使用PHP连接来创建一个RegEx,但这需要至少4行代码,每个字母只有第一行。