首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使正则表达式在找到每个匹配项时不使用文本?

如何使正则表达式在找到每个匹配项时不使用文本?
EN

Stack Overflow用户
提问于 2020-10-07 15:43:24
回答 3查看 49关注 0票数 2

我需要检测内容中的四个字密码,它们是从n字到m字之间的序列。所有四个单词的序列都必须被检测,即使是部分重叠的序列,这是我的问题,因为我只知道如何写一个序列,该序列消耗四个单词,然后移动到从那个单词末尾开始的下一个fords序列。

例如,如果我有顺序:

随机正确的马电池短钉虫锡帽

我用:

(A-Za-z0-9+ ){4}(A-Za-z0-9+)

它只会发现:

  • 随机校正马队

  • 短缩锡帽

但实际上我需要找到以下所有内容:

  • 随机校正马队
  • 正确的马电池短钉
  • 马电池短钉虫
  • 电池短钉虫锡
  • 短缩锡帽

所以提供的字符串中的所有四个单词序列。

我明白我的问题是,当我的正则表达式找到第一次匹配时,它会消耗掉前四个单词。

任何人都可以解释如何使正则表达式只“消耗”第一个单词,然后给我从第二个单词开始的下一个有效序列,等等。

谢谢!

  • 列表项目
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-10-09 09:20:10

正如注释中指出的,要匹配4个单词,量词必须是3,而不是4,这样才能使总数达到4。

在匹配字符[A-Za-z0-9]时,可以使用单词边界\b启动匹配。

然后(如果支持的话)使用一个积极的前瞻性来捕获单个捕获组中的4个单词。

代码语言:javascript
复制
\b(?=((?:[A-Za-z0-9]+ ){3}[A-Za-z0-9]+\b))
  • \b A字界
  • (?=正向前看,直接向右断言为
    • ( Capture group 1
      • (?:[A-Za-z0-9]+ ){3}重复3次匹配的1+,乘以字符类,后面跟着空格
      • [A-Za-z0-9]+\b匹配1+乘以列出的任何一个单词边界

代码语言:javascript
复制
- `)` Close group 1
  • )近景

Regex演示

与您尝试的模式相反的Note,量词重复非捕获组(?:[A-Za-z0-9]+ ){3},因为重复捕获组只返回上次迭代的捕获。

没有标记的语言,例如Javascript

代码语言:javascript
复制
const regex = /\b(?=((?:[A-Za-z0-9]+ ){3}[A-Za-z0-9]+\b))/g;
const str = `random correct horse battery staple bug tin hat`;
let m;

while ((m = regex.exec(str)) !== null) {
  // This is necessary to avoid infinite loops with zero-width matches
  if (m.index === regex.lastIndex) {
    regex.lastIndex++;
  }
  console.log(m[1]);
}

票数 0
EN

Stack Overflow用户

发布于 2020-10-07 19:03:53

你可能会成功的看头和后面寻找解决多重重叠,如果你成功了,我相信表达将是混乱的。下面是关于regex前瞻性,查找后面的链接:

Regex前瞻、查找和原子组

这可能有助于:

它不是用正则表达式来解决的。它与“滑动窗口”和四个“单词”相匹配:

代码语言:javascript
复制
public static void main(String[] args) {
    String input = "random correct horse battery staple bug tin hat";
    String[] arr = input.split("\\s+");

    Pattern pattern = Pattern.compile("([A-Za-z0-9]+\\s){4}");

    for (int i = 0; i <= arr.length - 4; i++){
        String fourWords = String.format("%s %s %s %s ", arr[i], arr[i + 1], arr[i + 2], arr[i + 3]);
        Matcher matcher = pattern.matcher(fourWords);

        if(matcher.find()) {
            System.out.println(matcher.group());
        }
    }
}

输出:

代码语言:javascript
复制
random correct horse battery
correct horse battery staple
horse battery staple bug
battery staple bug tin
staple bug tin hat 
票数 0
EN

Stack Overflow用户

发布于 2020-10-07 19:18:19

不能仅用regex来完成,因为返回的输入是消耗的。

拆分字符串并与令牌一起工作(如

代码语言:javascript
复制
List<String> words = Arrays.asList(sentence.split(" "));
List<List<String>> fourGrams = new ArrayList<>();
for (int i = 0; i < array.length - 4; i++) {
    fourGrams.add(words.subList(i, i + 4));
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64247618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档