【问题标题】:How to cut string from start to second last dot of the string?如何从字符串的开始到倒数第二个点切割字符串?
【发布时间】:2016-06-14 12:06:11
【问题描述】:

我有一些字符串,例如:

cats, e.g. Barsik, are funny. And it is true. So,

我想得到结果:

cats, e.g. Barsik, are funny.

我的尝试:

mb_ereg_search_init($text, '((?!e\.g\.).)*\.[^\.]');
$match = mb_ereg_search_pos();

但它获得第二个点的位置(在单词“true”之后)。

如何得到想要的结果?

【问题讨论】:

  • 您的标题具有误导性,因为您需要匹配表示句子结尾的第一个句号。这是一种幼稚的方法:'~(?<!\be\.g)\.(?=\s+\p{Lu})~'(与preg_match 一起使用)。但是,您可能需要某种 NLP 包。
  • @Wiktor Stribiżew,谢谢
  • 还有其他缩写,这并不是在所有情况下都有效。
  • 您可以通过preg_match(?:\b\w\.|[^.])+\. 获得所需的输出。 \b 匹配单词边界\w单词字符。怎么样Mr. Higgins...
  • 长篇大论但有效:https://3v4l.org/l3ibc

标签: php regex mbstring


【解决方案1】:

由于幼稚的方法适合您,因此我发布了答案。但是,请注意,检测句子结尾对于正则表达式来说是一项非常困难的任务,虽然在某种程度上是可能的,但应该使用 NLP 包。

话虽如此,我建议使用

'~(?<!\be\.g)\.(?=\s+\p{Lu})~ui'

正则表达式匹配任何点 (\.),它前面不是一个完整的单词 e.g(请参阅否定的后向查找 (?&lt;!\be\.g)),但后面是 1 个或多个空格 (\s+),然后是1 个大写 Unicode 字母 \p{Lu}

regex demo

不区分大小写的 i 修饰符不会影响 \p{Lu} 匹配的内容。

~u 修饰符是必需的,因为您使用的是 Unicode 文本(如俄语)。

要获取第一次出现的索引,请使用带有PREG_OFFSET_CAPTURE 标志的preg_match 函数。这是您在 cmets 中提供的一些简化的正则表达式:

preg_match('~(?<!т\.н)(?<!т\.к)(?<!e\.g)\.(?=\s+\p{L})~iu', $text, $match, PREG_OFFSET_CAPTURE);

查看前瞻是一个接一个地执行,并且在字符串中的相同位置,因此,您不必另外将它们分组到正前瞻中。请参阅regex demo

IDEONE demo:

$re = '~(?<!т\.н)(?<!т\.к)(?<!e\.g)\.(?=\s+\p{L})~iu';
$str = "cats, e.g. Barsik, are funny. And it is true. So,"; 
preg_match($re, $str, $match, PREG_OFFSET_CAPTURE);
echo $match[0][1];

【讨论】:

    【解决方案2】:

    这里有两种方法可以从初始字符串的开头到倒数第二个. 位置获取子字符串:

    • 使用strrpossubstr 函数:

      $str = 'cats, e.g. Barsik, and e.g. Lusya are funny. And it is true. So,';
      $len = strlen($str);
      $str = substr($str, 0, (strrpos($str, '.', strrpos($str, '.') - $len - 1) - $len) + 1);
      
      print_r($str);  // "cats, e.g. Barsik, and e.g. Lusya are funny."
      
    • 使用array_reversestr_splitarray_search 函数:

      $str = 'cats, e.g. Barsik, and e.g. Lusya are funny. And it is true. So,';
      $parts = array_reverse(str_split($str));
      $pos = array_search('.', $parts) + 1;
      $str = implode("", array_reverse(array_slice($parts, array_search('.', array_slice($parts, $pos)) + $pos)));
      
      print_r($str);  // "cats, e.g. Barsik, and e.g. Lusya are funny."
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      • 2022-01-23
      • 2015-12-14
      • 2014-12-15
      • 1970-01-01
      相关资源
      最近更新 更多