Java – 正则表达式 – 匹配开始和结束卷曲标签
Posted
技术标签:
【中文标题】Java – 正则表达式 – 匹配开始和结束卷曲标签【英文标题】:Java – Regex – match opening and closing curly tags 【发布时间】:2019-08-10 22:36:32 【问题描述】:我想捕获这样的文本:
ul
liItem 1/li
liItem 2/li
liItem 3/li
/ul
imgthis_is_an_image/img
pparagraph text /p h2Heading/h2
然后把它变成一个 hashmaps 的 ArrayList,像这样:
[
"ul" : ["Item 1", "Item 2", "Item 3"] ,
"img" : "this_is_an_image",
"p" : "paragraph text",
"h2" : "Heading"
]
目前我有一个 while 循环,它能够从字符串中获取“基本”级别的项目(即不是嵌套项目)。
ArrayList<Object> list = new ArrayList<>();
Pattern pattern = Pattern.compile("\\(\\w+)(?:\\()?([^\\\\)]+)(?:\\\\/\1)?");
Matcher matches = pattern.matcher(s);
while (matches.find())
Map<String, String> match = new HashMap<>();
match.put(matches.group(1), matches.group(2));
list.add(match);
return list;
我想修改它以便能够匹配第一个捕获组 - 捕获开始和结束标记之间的所有内容,然后检查捕获组 2 中是否有嵌套标记 - 然后将它们放入数组中。
所以修改代码如下:
ArrayList<Object> list = new ArrayList<>();
Pattern pattern = Pattern.compile("New pattern");
Matcher matches = pattern.matcher(s);
while (matches.find())
Map<String, Object> match = new HashMap<>();
Pattern patt = Pattern.compile("only capture text within brackets pattern")
Matcher nestedMatches = patt.matcher(matches.group(2))
ArrayList<String> sublist = new ArrayList<>();
while(nestedMatches.find())
sublist.add(nestedMatches.group(2))
if (list.size() > 0)
match.put(matches.group(1), sublist);
else
match.put(matches.group(1), matches.group(2));
list.add(match);
return list;
我已经创建了这个正则表达式:\(\w+)\(.*)(?:\\1\)?
(此处的 obv 不是 java 格式),但它不会在结束大括号 /group1
处停止,而是继续捕获所有内容。
我是这些更复杂的正则表达式模式的新手,所以如果有人能在这里帮助我,我将不胜感激——感觉我已经接近解决这个问题了。
这是一个Regex 101 显示我的问题
【问题讨论】:
您可以使用:(?s)\(\w+)(.*?)\/\1
【参考方案1】:
你已经不远了,你可以使用这个正则表达式:
(?s)\(\w+)(.*?)\/\1
Updated RegEx Demo
在 Java 中使用:
final String regex = "(?s)\\(\\w+)\\(.*?)\\/\\1\\";
正则表达式详细信息:
(?s)
:结束DOTALL
模式
\(\w+): Match opening tag as
tag` 并在捕获组 #1 中捕获标记名称
(.*?)
: 再匹配 0 个字符(非贪婪)并将其捕获到第 #2 组中
\/\1
:使用组#1 的反向引用将结束标记匹配为/tag
【讨论】:
刚刚尝试过——就像一个魅力一样,上面的代码作为“初始”正则表达式,然后线程中的原始正则表达式作为辅助匹配器。感谢您的帮助!以上是关于Java – 正则表达式 – 匹配开始和结束卷曲标签的主要内容,如果未能解决你的问题,请参考以下文章