使用regex从字符串中提取特定数据

时间:2014-10-09 07:28:09

标签: java regex

我想捕获多个符合某些特定模式的字符串, 例如,我的字符串就像

String textData = "#1_Label for UK#2_Label for US#4_Label for FR#";

我想在两个#之间获取字符串,它与UK

之类的字符串匹配

输出应该是这样的 如果匹配字符串是UK而不是
    输出应为1_Label for UK

如果匹配字符串是label而不是
    输出应为1_Label for UK, 2_Label for US4_Label for FR 如果匹配字符串是1_而不是

    输出应为1_Label for UK

我不想通过数组列表提取数据,并且提取应该不区分大小写。

你可以帮我解决这个问题吗?

此致 Ashish Mishra

4 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式进行搜索:

#([^#]*?Label[^#]*)(?=#)

Label替换为您的搜索关键字。

RegEx Demo

Java模式:

Pattern p = Pattern.compile( "#([^#]*?" + Pattern.quote(keyword) + "[^#]*)(?=#)" );

答案 1 :(得分:1)

如果数据始终位于两个哈希值之间,请尝试使用以下正则表达式:(?i)#.*your_match.*#其中your_matchUKlabel1_等。

然后将此表达式与PatternMatcher类结合使用。

如果您想匹配多个字符串,则需要使用环视方法以及不情愿的修饰符(例如,不需要修改符号)从匹配项中排除哈希值。 (?i)(?<=#).*?label.*?(?=#)

短暂崩溃:

  • (?i)会使表达式不区分大小写
  • (?<=#)是一个积极的后卫,即匹配必须以哈希为先(但不包括哈希)
  • .*?匹配任何字符序列但是不情愿,即它尝试匹配尽可能少的字符
  • (?=#)是一个积极的预测,这意味着匹配必须后跟一个哈希(也不包含在匹配中)

如果没有环视方法,则哈希将包含在匹配中,因此使用Matcher.find()您可以跳过测试字符串中的每个其他标签,即您获得匹配{{ 1}}和#1_Label for UK#但不是#4_Label for FR#

如果没有relucatant修饰符,表达式将匹配第一个和最后一个哈希值之间的所有内容。

作为替代方案并且更好,将#2_Label for US#替换为.*?,这意味着匹配不能包含任何哈希,从而消除了对不情愿修饰符的需求以及消除查找{的问题{1}}将匹配[^#]*

所以最有可能是你看完这样的最终正则表达式:US

答案 2 :(得分:1)

([^#]*UK[^#]*)   for UK

([^#]*Label[^#]*) for Label

([^#]*1_[^#]*)    for 1_

试试这个。抓住捕获。参见演示。

http://regex101.com/r/kQ0zR5/3

http://regex101.com/r/kQ0zR5/4

http://regex101.com/r/kQ0zR5/5

答案 3 :(得分:0)

我用以下模式解决了这个问题,

(?i)([^#]*?us[^#]*)(?=#)

非常感谢Anubhava,VKS和Thomas回复。

的问候,
Ashish Mishra