【问题标题】:trying to run regex against semi-colon separated list of words试图对分号分隔的单词列表运行正则表达式
【发布时间】:2014-07-11 20:01:28
【问题描述】:

我有一个以分号分隔的单词列表(大约 180,000 个单词),如下所示:

;test;dog;cat;hello;whatever;

如何使用正则表达式获取包含特定子字符串的所有单词的数组? 例如 - 我如何获得所有包含字母 a 的单词? 我试过这个:

preg_match_all('#(?:;).*a.*(?:;)#u', $one_line, $matches);

^但它似乎没有产生正确的结果?...我做错了什么?

【问题讨论】:

    标签: php regex pcre


    【解决方案1】:

    获取所有包含字母 a 的单词?

    使用preg_match_all方法从索引1获取匹配组。

    (\w*a\w*)
    

    Online demo


    如果分号之间有多个单词,请按照下面 cmets 中 @anubhava 的建议尝试下面的正则表达式。

    [^;a]*a[^;]*
    

    Online demo

    【讨论】:

    • [^;a]*a[^;]*怎么样
    • @anubhava 使用您的模式,它也将匹配两个单词。 demo
    • [^;a]*a[^;]* 将只匹配每个标记文本,假设 ; 是分隔符
    • 但 OP 只是在谈论文字。让我也为那个案例更新我的帖子。
    • @anubhava 谢谢 这是一个很棒的模式,但有些更让我困惑。
    【解决方案2】:

    我个人倾向于分两步...首先,将字符串分解成一个数组:

    $entries = explode (";", $yourstring);
    

    然后你可以对数组中的每个组件做一个干净的正则表达式,而不必担心分号:

    $matches = preg_grep ("/a/" , $entries);
    

    根据我的经验,尝试将分隔符与其他正则表达式一起包含会很快使事情变得相当复杂。

    【讨论】:

    • explode 是个好主意,但由于您正在寻找固定字符串 ("a"),我建议您将性能与 foreachstrpos(这两种方式我没有测试过,比较结果可能会很有趣)
    • 是的,但这只是一个例子——我假设他所指的正则表达式可能来自搜索查询或其他东西,因此需要与正则表达式兼容——如果它纯粹是为了“a”,你'完全正确,我不会碰 preg_grep。
    • 是的,确实有可能。
    【解决方案3】:

    Braj 对于正则表达式示例是正确的,但是我想提出另一种方法来做到这一点,可能是用分号分割字符串。

    例如使用这样的东西:

    array explode ( string $delimiter , string $string [, int $limit ] )
    

    -返回一个字符串数组,每个字符串都是在字符串分隔符形成的边界上拆分字符串形成的子字符串。

    那么你可以简单地检查每个字符串是否包含字母a。我相信在某些情况下这可能更有效。如果您正在寻找包含“a”、“aa”和“aaa”的单词,可能会更有效。您可以将字符串拆分为一个数组,然后检查每个字符串是否包含“a”。然后你可以缩短你需要检查'aa'和'aaa'的字符串。只是想我会指出,假设正则表达式是必要的并不一定总是有益或最有帮助的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-14
      • 1970-01-01
      相关资源
      最近更新 更多