我需要提取字符串的某个部分,但该字符串的模式可能会有所不同。
我们谈论的是一个定义了一堆属性的字符串,即[name = value]对。例如:
"a=somevalueb=othervaluec=lastvalue"
我需要获取属性b的值(“othervalue”)。但是,属性不是指定的顺序。此外,某些属性(包括b)可能根本不存在。最大的问题是属性不是必须的(但可能是!)由任何东西分开,所以我不能拆分然后只得到以“b =”开头的块。我需要在整个字符串中找到属性。
我所知道的是:
到目前为止,我最好的想法是首先切断“b =”之前的任何内容(使用indexOf()和substring()),然后对所有已知属性名称进行循环并检查是否包含此属性,然后不知何故把它切掉了。
但我觉得可能会有更优雅的方式。我尝试了一些正则表达式,但不知道要提取什么(group(???)),因为字符串模式可能会有所不同。
感谢您的建议! (顺便说一句:如果重要的话,实现将采用Java)
答案 0 :(得分:2)
很容易找到您正在寻找的值的开头。诀窍是找到结束,因为你的文字形成不良。
根据您的描述,值结束于文本末尾(显然),或者当另一个已知密钥存在时。
b=(.*?)(?=a=|c=|d=|e=|$)
<强>跟进强>
要在“属性值可以包含换行符”(来自评论)时工作,有两种方法:
Pattern.DOTALL
标志作为compile()
(?s)b=(.*?)(?=a=|c=|d=|e=|$)