我需要提取字符串的特定部分,但该字符串的模式可能会有所不同。
我们正在讨论一个定义一堆属性的字符串,即 [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/