【问题标题】:How to match regex pattern on single line only?如何仅在单行上匹配正则表达式模式?
【发布时间】:2014-04-24 18:29:28
【问题描述】:

我有以下正则表达式和示例输入:

http://regex101.com/r/xK9dE3

如您所见,它与第一个“哟”匹配。我只希望模式与“cut me”在同一行(第二个“yo”)模式匹配。

如何确保正则表达式匹配仅在同一行上?

输出:

Hi

预期输出(这是我真正想要的):

Hi

yo keep this here

Keep this here

【问题讨论】:

  • 使用Pattern.MULTILINE ^ 匹配每行的开头,$ 匹配每行的结尾
  • 非常感谢....我使用的是 java Pattern 对象

标签: java regex


【解决方案1】:

您可以将此正则表达式与 s (DOTALL) 正则表达式标志一起使用:

^.*?(?=yo\b[^\n]*cut me:)

在线演示:http://regex101.com/r/oV3eP7

yo\b[^\n]*cut me: 是前瞻模式,可确保带有单词边界的 yocut me: 在同一行中匹配。

【讨论】:

    【解决方案2】:

    删除 sDOTALL 标志并将您的正则表达式更改为以下内容:

    ^.*?((\yo\b.*?(cut me:)[\s\S]*))
    

    启用DOTALL 标志后,. 将匹配换行符,因此您的匹配可以跨越多行,包括yo 之前或yocut me 之间的行。通过删除此标志,您可以确保只匹配yocut me 的行,然后将末尾的.* 更改为[\s\S]*,这将匹配包括换行符在内的任何字符,以便您可以匹配到字符串的结尾。

    http://regex101.com/r/sX2kL0

    编辑:请注意,这与其他答案的方法略有不同,这将匹配您要删除的字符串部分,因此您可以用空字符串替换该部分以将其删除.

    【讨论】:

    • cool...这基本上是我想要实现的,因为一旦我匹配了那个模式(匹配多余的东西)我会在模式匹配上做一个 replaceall(excess, "") ,这是多余的这基本上保留了上面的东西.. Thx!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多