[英]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 US
和4_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_match
为UK
, label
, 1_
等。
然后将此表达式与Pattern
和Matcher
类结合使用。
如果要匹配多个字符串,则需要使用环顾四周的方法以及勉强的修饰符(例如(?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
我已经通过以下模式解决了这个问题,
(?i)([^#]*?us[^#]*)(?=#)
非常感谢Anubhava,VKS和Thomas的回复。
问候,
阿什什·米什拉(Ashish Mishra)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.