正则表达式在n个特定字符出现次数后选择

时间:2011-09-28 14:38:03

标签: php mysql regex pattern-matching

在这里创建一些正则表达式。我想知道是否可以得到一些关于如何在一个字符出现之后以及在某个字符的下一个出现之前选择一个字符串的指示。

例如

xyz|yui|i want to select this.

在这个例子中,我想在第二个“|”之后选择然后在下一个“。”之前。所以我要匹配的文字是“我想选择这个”。

感谢任何指点。

更新

为了更具体地说明为什么我需要在上面执行此操作,在“我想选择此项”结束时段后面会有更多文字。基本上这是我想要划分的无限内容。因此,我已经能够分割前两个字段,现在我需要能够在最后一个“|”之后仅选择文本并在下一个时期之前添加“|”性格到底。所以期望的结果将是

xyz|yui|i want to select this.|

很抱歉没有更具体的结果,我希望这有点清除它。感谢您的信息,超级。

3 个答案:

答案 0 :(得分:5)

你的正则表达式看起来像这样:

/^(?:.+?\|){2}(.+?[^(Co)]\.)/

PHP

<?php
    preg_match('/^(?:.+?\|){2}(.+?[^(Co)]\.)/','xyz|yui|This is a Co. sentence. Ending before this clause.',$out);
    echo $out[1];
?>

<强>无论其

您应该通过竖线字符进行爆炸并访问相应的信息:

$stuff = explode('|','xyz|yui|i want to select this.');
echo $stuff[2];

答案 1 :(得分:2)

首先,你需要在这里创建一个包含重复部分([^|]+\|)的组,可以将其设置为恰好两次显示{2},然后你需要匹配其余的(.*)

^([^|]+\|){2}(.*?)\.

更新

您可以将其取消为@Karolis提到的?:

^(?:[^|]+\|){2}(.*?)\.

第一个正则表达式第二场比赛将是你的,第二场比赛将是第一场比赛。

答案 2 :(得分:1)

这样做:

$text = 'xyz|yui|i want to select Co. this. But not this.';
$re = '/# Match stuff after nth occurance of a char.
    ^               # Anchor to start of string.
    (?:[^|]*\|){2}  # Everything up through 2nd "|"
    (               # $1: Capture up through next "."
      [^.]*         # Zero or more non-dot.
      (?:           # Allow dot if in "Co.".
        (?<=Co)     # If dot is preceded by "Co",
        \.          # then allow this dot.
        [^.]*       # Zero or more non-dot.
      )*            # Zero or more "Co." dots allowed.
      \.            # First dot that is not "Co."
    )               # End $1: Capture up through next "."
    /ix';
$text = preg_replace($re, '$0|', $text);
echo $text;

编辑2011-09-28 10:00 MDT:添加了跳过点的功能:"Co."
编辑2011-09-28 10:30 MDT:更改为使用preg_replace()插入|点之后。