如何从模糊的模式中提取子字符串

时间:2015-10-29 17:49:08

标签: java regex string

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

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

"a=somevalueb=othervaluec=lastvalue"

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

我所知道的是:

  • 可能属于字符串
  • 的属性
  • 每个属性最多可以出现一次(但可能根本不会出现)
  • ,当然,我知道我要提取的属性

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

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

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

1 个答案:

答案 0 :(得分:2)

很容易找到您正在寻找的值的开头。诀窍是找到结束,因为你的文字形成不良。

根据您的描述,值结束于文本末尾(显然),或者当另一个已知密钥存在时。

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

<强>跟进

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

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