我想捕获多个符合某些特定模式的字符串, 例如,我的字符串就像
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 US
和4_Label for FR
如果匹配字符串是1_
而不是
输出应为1_Label for UK
我不想通过数组列表提取数据,并且提取应该不区分大小写。
你可以帮我解决这个问题吗?
此致 Ashish Mishra
答案 0 :(得分:2)
您可以使用此正则表达式进行搜索:
#([^#]*?Label[^#]*)(?=#)
将Label
替换为您的搜索关键字。
Java模式:
Pattern p = Pattern.compile( "#([^#]*?" + Pattern.quote(keyword) + "[^#]*)(?=#)" );
答案 1 :(得分:1)
如果数据始终位于两个哈希值之间,请尝试使用以下正则表达式:(?i)#.*your_match.*#
其中your_match
为UK
,label
,1_
等。
然后将此表达式与Pattern
和Matcher
类结合使用。
如果您想匹配多个字符串,则需要使用环视方法以及不情愿的修饰符(例如,不需要修改符号)从匹配项中排除哈希值。 (?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
答案 3 :(得分:0)
我用以下模式解决了这个问题,
(?i)([^#]*?us[^#]*)(?=#)
非常感谢Anubhava,VKS和Thomas回复。
的问候,
Ashish Mishra