当前位置: 首页 > 知识库问答 >
问题:

Java正则表达式:将文本提取到数组列表中

诸葛绍元
2023-03-14

我正在努力与一个简单的正则表达式,我似乎不能得到正确的。

我有一些文字如下:

This comment is great **[@madeUpUser1](/madeUpUser1)** You said something similar did you mate? **[@madeUpUser2](/madeUpUser2)**

最后,我希望得到一个数组列表,其中包含括号中的用户名,即:

0.madeUpUser1
1.madeUpUser2

这是我到目前为止的代码:

List<String> matches = Pattern.compile("\\((.+?)\\)")
        .matcher("This comment is great **[@madeUpUser1](/madeUpUser1)** You said something similar did you mate? **[@madeUpUser2](/madeUpUser2)**")
        .results()
        .map(MatchResult::group)
        .collect(Collectors.toList());

然而,我得到的反馈是:

0."(/madeUpUser1)"
1."(/madeUpUser2)"

再一次,我想:

0.madeUpUser1
1.madeUpUser2

即没有括号和前斜杠

有人能解释一下我的正则表达式出了什么问题吗?

共有3个答案

陈飞语
2023-03-14

您可以使用捕获组,并匹配外圆括号/方括号:

\(/([^\s()]+)\)
  • \(/匹配(/
  • 捕获组1
    • [^\s()]匹配除空格字符或)以外的1个字符

    正则表达式演示

    List<String> matches = Pattern.compile("\\(/([^\\s()]+)\\)")
        .matcher("This comment is great **[@madeUpUser1](/madeUpUser1)** You said something similar did you mate? **[@madeUpUser2](/madeUpUser2)**")
        .results()
        .map(m -> m.group(1))
        .collect(Collectors.toList());
    
    for (String s : matches)
        System.out.println(s);
    

    输出

    madeUpUser1
    madeUpUser2
    

    或者在本例中,方括号之间的字符串似乎相同,因此使用相同代码的另一个选项可能是:

    \[@([^\s\]\[]+)]
    
    • \[@匹配[@
    • 捕获组1
      • [^\s\]\[] 匹配1个空白字符或[]
      • 以外的字符

      正则表达式演示| Java演示

常雪风
2023-03-14

您可以匹配](/,然后捕获除以外的任何零个或多个字符,直到下一个,并仅收集组1匹配项:

import java.util.*;
import java.util.regex.*;
import java.util.stream.Collectors;


class Test
{
    public static void main (String[] args) throws java.lang.Exception
    {
        String text = "This comment is great **[@madeUpUser1](/madeUpUser1)** You said something similar did you mate? **[@madeUpUser2](/madeUpUser2)**";

        Pattern p = Pattern.compile("]\\(/([^()]*)\\)");
        List<String> results = p.matcher(text)
            .results()
            .map(mr -> mr.group(1))
            .collect(Collectors.toList());
        
        // Or, to get a string array:
        // String[] results = p.matcher(text).results().map(mr -> mr.group(1)).toArray(String[]::new);

        for (String x: results) {
            System.out.println(x);
        }
    }
}

请参阅在线演示。输出:

madeUpUser1
madeUpUser2

请参阅regex演示。细节:

  • ]\(/-a])/string
  • ([^()]*)-捕获组1:除
  • 之外的任何零个或多个字符
  • \)-achar.
凌照
2023-03-14

试试这个正则表达式:

(?<=\\(/)[^)]+(?=\\))

点击演示

解释

>

  • (?

    [^)]-匹配任何非字符的一次或多次出现(尽可能多)

    (?=\\)-正向前瞻以确保当前位置后面紧跟着一个

    使用正则表达式,\\((.?)\\),会发生以下情况:

    • \\(-匹配左括号

  •  类似资料:
    • 问题内容: 我想从一般的HTML页面中提取所有文本(是否显示)。 我想 删除 任何HTML标记 任何JavaScript 任何CSS样式 是否有一个正则表达式(一个或多个)可以实现? 问题答案: 您不能真正用正则表达式解析HTML。太复杂了。RE根本无法正确处理部分。此外,某些常见的HTML之类的东西将在浏览器中作为适当的文本工作,但可能会使天真的RE感到困惑。 有了合适的HTML解析器,您会更快

    • 问题内容: 我的数据库中有Markdown格式的文本。我想提取链接并计算我拥有的匹配链接的数量。我可以使用类似于以下的查询来获取包含链接的文本块的列表: 但是,如何进行下一步,仅提取文本的链接部分(括号中的部分)?如果可以得到,则可以计算此特定链接在我的数据集中的次数。 一些样本数据: 我正在使用SQL Server 2012(如果这方面的版本之间存在差异)。 问题答案: 假设实际数据不比所陈述的

    • 我有3个正则表达式,但当模式匹配时执行相同的操作,所以我考虑将所有三个表达式合并为一个。我尝试了很多,但无法让“|”I.e”或“在我的正则表达式中工作 regex1:<代码>文本。替换(/([\u00A9-\u3299])/g,函数myFunction(x){…} regex2: regex3: 我试过这样做,但它不起作用regex:

    • 问题内容: 我正在尝试同时接收模式和字符串,并返回组名的映射->匹配结果。 例: 我想返回一个包含“ user”作为键及其匹配值的映射。 问题是我似乎无法从Java regex api获取组名。我只能按名称或按索引获取匹配的值。我没有组名列表,Pattern和Matcher似乎都没有公开此信息。我检查了它的来源,似乎信息就在那里- 只是不向用户公开。 我尝试了Java的java.util.rege

    • 问题内容: 我想要一个正则表达式,它将从String中提取电子邮件地址(使用Java正则表达式)。 那确实有效。 问题答案: 这是真正有效的正则表达式。我花了一个小时在网上冲浪并测试了不同的方法,尽管Google在这些页面上排名最高,但大多数方法都无效。 我想与您分享一个有效的正则表达式: 这是原始链接:http : //www.mkyong.com/regular-expressions/how

    • 问题内容: 我正在尝试输入之间的内容,我的模式没有做正确的事,请帮忙。 下面是sudocode: 要求的输出: 之一 二 三 问题答案: 先行使用并在循环中使用,而不是: 看到它在线上工作:ideone 但是最好在这里使用split: 看到它在线上工作:ideone