繁体   English   中英

使用正则表达式从字符串中提取特定数据

[英]Extract specific data from string with regex

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

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

我想在两个#之间得到一个与UK匹配的字符串

如果匹配字符串为UK则输出应为:
1_Label for UK输出应为1_Label for UK

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

1_Label for UK输出应为1_Label for UK

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

您能帮我解决这个问题吗?

问候,Ashish Mishra

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

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

用您的搜索关键字替换Label

正则演示

Java模式:

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

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

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

如果要匹配多个字符串,则需要使用环顾四周的方法以及勉强的修饰符(例如(?i)(?<=#).*?label.*?(?=#)

简短的故障:

  • (?i)将使表达式不区分大小写
  • (?<=#)是正向后看,即匹配必须以散列开头(但不包括散列)
  • .*? 匹配任何字符序列但不愿意,即它尝试匹配尽可能少的字符
  • (?=#)是一个正向超前查询,表示匹配项后必须跟一个哈希值(也不包含在匹配项中)

如果没有环视方法,则哈希将包含在匹配项中,因此使用Matcher.find()会跳过测试字符串中的所有其他标签,即,将获得匹配项#1_Label for UK##4_Label for FR#但没有#2_Label for US#

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

作为替代方案,更好的是替换.*? [^#]* ,这意味着匹配项不能包含任何哈希,因此消除了对不情愿修饰符的需要,并消除了寻找US将与1_Label for UK#2_Label for US匹配的问题。

因此,很可能您要使用的最终正则表达式如下(?i)(?<=#)[^#]*your_match[^#]*(?=#)

([^#]*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

我已经通过以下模式解决了这个问题,

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

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

问候,
阿什什·米什拉(Ashish Mishra)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM