java - 如何从不明确的模式中提取子字符串

标签 java regex string

我需要提取字符串的特定部分,但该字符串的模式可能会有所不同。

我们正在讨论一个定义一堆属性的字符串,即 [name=value] 对。例如:

"a=somevalueb=othervaluec=lastvalue"

我需要获取属性 b 的值(“othervalue”)。但是,这些属性并不按指定的顺序排列。此外,某些属性(包括 b)可能根本不存在。最大的问题是属性不一定(但可能是!)被任何东西分开,所以我不能分割然后只得到以“b=”开头的 block 。我需要在整个字符串中找到某个属性。

我所知道的是:

  • 字符串中可能有哪些属性
  • 每个属性最多可以出现一次(但也可能根本不会出现)
  • 而且,我当然知道我想要提取的属性

到目前为止,我最好的想法是首先切断“b=”之前的任何内容(使用indexOf()和substring()),然后对所有已知的属性名称进行循环并检查是否包含该属性,然后以某种方式把它剪掉。

但我觉得可能有更优雅的方式。我尝试使用一些正则表达式,但真的不知道要提取什么(组(???)),因为字符串模式可能会有所不同。

感谢您的建议! (顺便说一句:如果重要的话,可以用 Java 实现)

最佳答案

很容易找到您要查找的值的开头。诀窍是找到结尾,因为你的文本格式很糟糕。

根据您的描述,该值要么在文本末尾(显然),要么在存在另一个已知键时结束。

b=(.*?)(?=a=|c=|d=|e=|$)

跟进

要在“属性值可以包含换行符”(来自注释)时工作,有两种方法:

  • 指定Pattern.DOTALL标志作为 compile() 的第二个参数
  • 在正则表达式中打开该标志:(?s)b=(.*?)(?=a=|c=|d=|e=|$)

关于java - 如何从不明确的模式中提取子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33421269/

相关文章:

java - 仅当在一定时间内检测到信标时才显示通知

java - Android 中的无限按钮动画

Java在线程中处理输入流

python - 如何使用正则表达式删除转义序列(例如\"escaped string\")?

javascript - (.+?) 在正则表达式中的用途

java - 如何从 JSON 的子级获取数据

java - 理解 Java 正则表达式

c# - 删除 "[ ]"和字符串中出现的所有内容

java - 如何使用扫描仪捕获txt文件中的字符串?

java - 在某个字符的最后一次出现处拆分字符串