我正在努力与一个简单的正则表达式,我似乎不能得到正确的。
我有一些文字如下:
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
即没有括号和前斜杠
有人能解释一下我的正则表达式出了什么问题吗?
您可以使用捕获组,并匹配外圆括号/方括号:
\(/([^\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演示
您可以匹配](/
,然后捕获除(
和)
以外的任何零个或多个字符,直到下一个)
,并仅收集组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:除)
和(
\)
-a)
char.试试这个正则表达式:
(?<=\\(/)[^)]+(?=\\))
点击演示
解释
>
(?
[^)]
-匹配任何非字符的一次或多次出现(尽可能多)
(?=\\)
-正向前瞻以确保当前位置后面紧跟着一个)
使用正则表达式,
\\((.?)\\)
,会发生以下情况:
\\(
-匹配左括号(
问题内容: 我想从一般的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