【发布时间】:2014-09-03 23:13:57
【问题描述】:
如何在 Java 中匹配分隔符之间的多行文本?
问题最好用一个例子来解释:
...
unimportant text
EndOfEntry
Key=Value
unimportant text
maybe a few lines of unimportant text
AnotherKey=AnotherValue
EndOfEntry
more unimportant text
...
在上面,我想匹配 Key=Value.*AnotherKey=AnotherValue 一起出现在一个条目中。我只是想知道模式是否出现——我不需要替换任何东西。
但是,如果给定多个条目,则具有相同的期望匹配,例如:
...
unimportant text
EndOfEntry
Key=Value
unimportant text
maybe a few lines of unimportant text
AnotherKey=NotMyValue
EndOfEntry
RandomKey=Value
unimportant text
maybe a few lines of unimportant text
AnotherKey=AnotherValue
EndOfEntry
more unimportant text
...
我不希望成功匹配上述内容,因为我们在单个“条目”中看不到确切的 Key=Value 和 AnotherKey=AnotherValue。相反,我们在第一个条目中看到 Key=Value,在第二个条目中看到 AnotherKey=AnotherValue。
我一直在尝试使用类似的正则表达式(当然 \S\s 可以用 Pattern 的 DOTALL 选项替换):
Key=Value[\S\s]*?AnotherKey=AnotherValue
但当然两者都匹配。我也试过:
Key=Value[^EndOfEntry]*?AnotherKey=AnotherValue
但这不起作用,因为没有点而且我们根本不匹配换行符。
是否有一个正则表达式可以精确匹配我正在寻找的内容?是否会简化首先去除换行符或其他一些两步处理的事情(我只是为了教育而试图避免)?
【问题讨论】:
-
我不清楚您的需求。你能提供一个更好的输入示例和你想要的输出吗?
-
Key=Value[\S\s]*?AnotherKey=AnotherValue[\S\s]*?EndOfEntry做你想要的?是否保证每个条目都以 Key=Value 开头? -
没关系,你需要一个否定的环视,因为这在你的例子中会匹配太多。正则表达式在这里可能不是正确的工具。
-
@Fede,所需的输出应该只是匹配或不匹配
-
我同意@adamdc78;尝试使用一个正则表达式完成所有工作并不是正确的方法。我会遍历每一行并测试匹配。当你点击
EndOfEntry时,使用计数器或其他东西来跟踪。