【问题标题】:How to extract text from multiple lines including the first and last word?如何从多行中提取文本,包括第一个和最后一个单词?
【发布时间】:2020-01-12 22:14:24
【问题描述】:

我正在尝试提取长文本的一部分,例如有关照顾植物的信息。文本包含段落和空行。我无法捕获我想要的特定文本,第二个问题是提取的文本中没有显示最后一个单词,最后一个问题是我的搜索从行首开始。

我尝试使用不在行首的单词来搜索我想要提取的文本,它可以正常工作,只是所需文本的末尾缺少一个单词,并且如果该单词是新的行,它根本不会显示任何结果。 我使用https://scriptun.com/tools/php/preg_match 进行测试

//开始搜索的第一个词是'How to'。我也想捕捉它 // 我想要的文本结束的第二个单词是 '(optional):'

'/(?=How to).*?\s(?=\(optional\):)/'

我用来测试的示例文本是:

//文本在此之前..

如何照顾裂叶植物

裂叶喜林,也称为 Monstera deliciosa 或 swiss 奶酪植物,是一种大型、受欢迎、易于护理的室内植物, 真正属于喜林属植物。有很多混乱 关于如何称呼这种植物;各种名字都变成了 多年来可互换。

这里有更多信息(可选):

//这里还有更多文字

我想从以 '(optional):' 结尾的单词 'How to' 中提取所有文本。无论中间有多少行或段落

预期提取的文本:

如何照顾裂叶植物

裂叶喜林,也称为 Monstera deliciosa 或 swiss 奶酪植物,是一种大型、受欢迎、易于护理的室内植物, 真正属于喜林属植物。有很多混乱 关于如何称呼这种植物;各种名字都变成了 多年来可互换。

这里有更多信息(可选):

谢谢

【问题讨论】:

    标签: php regex preg-match


    【解决方案1】:

    这很容易。您可以使用以下模式:

    https://regex101.com/r/TjE2x8/2

    模式:^How to[\w\W]+?\(optional\):$

    【讨论】:

    • 感谢您的帮助,它现在按预期工作。
    • 如果这回答了您的问题,您可以将其标记为答案。
    【解决方案2】:

    模式:^How to(?:.|\R)*optional\):$

    demo on regex101

    解释:

    • ^ 匹配How to 出现在行首的第一个实例
    • (?: ) 非捕获组。我们需要它是因为下面的OR 指令是管道|。但我们不需要捕获内容。这就是我们在第一个括号后使用?: 的原因。
    • .每个字符
    • |
    • \R各种新线
    • * 确保为组的每个实例捕获零
    • optional\):$ 将单词 optional 与括号匹配(转义,因为它不是指令)\) 和文本末尾的冒号 : $

    模式 2:/^How to.*optional\):$/ms

    demo on regex101

    此模式更简单,但需要设置 ms 标志以匹配多行,并且需要设置 . 字符类以匹配新行。

    【讨论】:

    • (?:.|\R)*[\w\W]+?(382 步)相比效率低(881 步),但您的第二种模式确实更好(64 步)。但是您不区分 2 个或更多段落。
    • 感谢您的帮助,它现在按预期工作。
    猜你喜欢
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2014-10-18
    • 2015-04-03
    • 2021-03-18
    • 1970-01-01
    相关资源
    最近更新 更多