我需要检测内容中的四个字密码,它们是从n字到m字之间的序列。所有四个单词的序列都必须被检测,即使是部分重叠的序列,这是我的问题,因为我只知道如何写一个序列,该序列消耗四个单词,然后移动到从那个单词末尾开始的下一个fords序列。
例如,如果我有顺序:
随机正确的马电池短钉虫锡帽
我用:
(A-Za-z0-9+ ){4}(A-Za-z0-9+)
它只会发现:
和
但实际上我需要找到以下所有内容:
所以提供的字符串中的所有四个单词序列。
我明白我的问题是,当我的正则表达式找到第一次匹配时,它会消耗掉前四个单词。
任何人都可以解释如何使正则表达式只“消耗”第一个单词,然后给我从第二个单词开始的下一个有效序列,等等。
谢谢!
发布于 2020-10-09 09:20:10
正如注释中指出的,要匹配4个单词,量词必须是3,而不是4,这样才能使总数达到4。
在匹配字符[A-Za-z0-9]时,可以使用单词边界\b启动匹配。
然后(如果支持的话)使用一个积极的前瞻性来捕获单个捕获组中的4个单词。
\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+乘以列出的任何一个单词边界- `)` Close group 1)近景与您尝试的模式相反的Note,量词重复非捕获组(?:[A-Za-z0-9]+ ){3},因为重复捕获组只返回上次迭代的捕获。
没有标记的语言,例如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]);
}
发布于 2020-10-07 19:03:53
你可能会成功的看头和后面寻找解决多重重叠,如果你成功了,我相信表达将是混乱的。下面是关于regex前瞻性,查找后面的链接:
这可能有助于:
它不是用正则表达式来解决的。它与“滑动窗口”和四个“单词”相匹配:
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());
}
}
}输出:
random correct horse battery
correct horse battery staple
horse battery staple bug
battery staple bug tin
staple bug tin hat 发布于 2020-10-07 19:18:19
不能仅用regex来完成,因为返回的输入是消耗的。
拆分字符串并与令牌一起工作(如
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));
}https://stackoverflow.com/questions/64247618
复制相似问题