regex - 2个字符串之间的java正则表达式匹配字符串
问题描述
我正在使用 Java 正则表达式,我想匹配字符串链中其他 2 个单词之间具有 5 个或更多字符的单词,但我的正则表达式仅匹配第一个单词。为什么我的正则表达式会停止搜索?
例子:java regex String chain = start here christian call me water next time by facebook there too
regex = (.*)(\bhere\b).?(\b[\w]{5,}\b).+(\bthere\b)
解决方案
你只用 . 捕获一个词(\b[\w]{5,}\b)
。您没有捕获here
和之间的任何其他词there
。
您可以使用
(?:\G(?!^)|^.*\bhere)(?:\W+\w{1,4})*\W+(\w{5,})(?=.+\bthere\b)
请参阅Java 正则表达式演示。详情:
(?:\G(?!^)|^.*\bhere)
- 上一个匹配的结尾或字符串的开头,除换行符之外的任何零个或多个字符,尽可能多,然后here
作为整个单词(?:\W+\w{1,4})*
- 零次或多次重复一个或多个非单词字符,然后是一到四个单词字符(跳过这些匹配项)\W+
- 一个或多个非单词字符(\w{5,})
- 第 1 组:五个或更多单词字符(?=.+\bthere\b)
- 积极的前瞻,确保there
在一个或多个字符之后有一个完整的单词,而不是换行字符,尽可能多。
请参阅Java 演示:
import java.util.regex.*;
import java.util.*;
class Test
{
public static void main (String[] args) throws java.lang.Exception
{
String text = "java regex String chain = start here christian call me water next time by facebook there too";
Pattern p = Pattern.compile("(?:\\G(?!^)|^.*\\bhere)(?:\\W+\\w{1,4})*\\W+(\\w{5,})(?=.+\\bthere\\b)");
Matcher m = p.matcher(text);
List<String> res = new ArrayList<>();
while(m.find()) {
res.add(m.group(1));
}
System.out.println(res);
}
}
// => [christian, water, facebook]
推荐阅读
- javascript - cy.reload() 无法在 Jenkins 上使用 Cypress 超时
- java - eclipse 上的 SonarLint:无法启动独立的 SonarLint 引擎
- jquery - 如何在提交没有特定库的表单时验证选择元素?
- java - 我制作了一个应用程序,如果您单击一个按钮,音频将播放,如果您单击两次,它将停止,但停止功能仅工作一次
- github-actions - 如何处理 GitHub Actions 在 7 天后删除其缓存
- logging - Azure ADF 管道复制数据日志文件未触发第二个管道的“已创建 Blob”触发器
- d3.js - d3js 移动节点旁边的标签
- powershell - Invoke-WUJob 什么都不做
- reactjs - 我应该保护构建的 NextJS 应用程序的哪些部分?
- c# - Automapper 包含父类的所有属性