Java正则表达式解析任意数量的标记样式链接

Java正则表达式解析任意数量的标记样式链接,java,regex,markdown,Java,Regex,Markdown,我正在尝试分析任何出现的标记样式链接的字符串,即[text](link)。我可以获取字符串中的第一个链接,但如果我有多个链接,则无法访问其余链接。以下是我尝试过的,您可以在上面运行它: 模式p; 试一试{ p=Pattern.compile(“[^\[]*\\[(?[^\\]]*)\]\\\(((?[^\\)]*)\\)(?:*”); }捕获(模式语法异常){ 系统输出打印项次(ex); 投掷(ex); } Matcher m1=p.Matcher(“你好”); Matcher m2=p.Mat

我正在尝试分析任何出现的标记样式链接的字符串,即
[text](link)
。我可以获取字符串中的第一个链接,但如果我有多个链接,则无法访问其余链接。以下是我尝试过的,您可以在上面运行它:

模式p;
试一试{
p=Pattern.compile(“[^\[]*\\[(?[^\\]]*)\]\\\(((?[^\\)]*)\\)(?:*”);
}捕获(模式语法异常){
系统输出打印项次(ex);
投掷(ex);
}
Matcher m1=p.Matcher(“你好”);
Matcher m2=p.Matcher(“你好[世界](女士们)”;
matcherm3=p.Matcher(“嗯,[这个](那个)有[两个](太多)键”);
System.out.println(“m1匹配:+m1.matches());//假的
System.out.println(“m2匹配:+m2.matches());//真的
System.out.println(“m3匹配:+m3.matches());//真的
System.out.println(“m2文本:+m2.group(“文本”);//世界
System.out.println(“m2链接:+m2.group(“链接”);//女士
System.out.println(“m3文本:+m3.group(“文本”);//这
System.out.println(“m3链接:+m3.group(“链接”);//那个
System.out.println(“m3结束:+m3.end());//44-我想要18
System.out.println(“m3计数:+m3.groupCount());//2-我想要4个
System.out.println(“m3查找:+m3.find());//虚假-我想要真实

我知道我做不到,但我想这会管用,但它并不像我预期的那样管用。如何修改我的方法,以便分析每个链接?

您不能逐个检查匹配项,然后在上一个匹配项之后从索引进行下一个匹配项吗?您可以使用此正则表达式:

\[(?<text>[^\]]*)\]\((?<link>[^\)]*)\)

我用来匹配所需内容(无组)的正则表达式是
\[\w+\]\(.+\)

这只是简单地向你展示。基本上是这样的:

  • 过滤正方形:
    \[
  • 后跟任何单词char(至少1):
    \w+
  • 然后是正方形:
    \]
这将查找这些模式
[blabla]

括号也一样

  • 筛选括号:
    \(
  • 后跟任何字符(至少1):
    +
  • 然后是括号:
    \)
因此它过滤
(ble…ble…)

现在,如果要在组中存储匹配项,可以使用以下附加括号:

while (m.find()) {
    String s = m.group(1);
    // s now contains "BAR"
}
(\[\w+\])(\(.+\)
通过这种方式,您可以存储单词和链接

希望对你有所帮助

我已经在regexplanet.com上试过了,它正在运行


更新:解决方法
*(\[\w+\])(\(.+\)*.

我尝试了类似的语法,但
m3.matches()
false
,可能是因为尾随字符不是
。关于如何解决这个问题,有什么建议吗?我想上述模式的问题是(?:*)导致匹配一直持续到字符串的末尾。所以你通过了所有其他可能的比赛。我会使用我建议的模式,从字符串中获取所有匹配项。奇怪的是,匹配项是假的。Find确实给出了答案中使用的模式的结果。在这里测试:
.matches()
false
带有
“\\\[(?[^\]*)\]\\\((?[^\]]*)\\)”
。但是
.find()
true
。我想我明白我必须要做什么,但是你能写下我要做什么才能得到每一对小组,这样我才能接受你的答案吗?这和我在Farhad的答案中遇到的问题是一样的。你能试试这个解决方法吗,我已经在最后更新了帖子,因为我不能在这里发布了,但我的问题是,我只能找到第一个
default
组和第一个
key
组。
while (m.find()) {
    String s = m.group(1);
    // s now contains "BAR"
}