regex Java匹配器相对于行启动

x33g5p2x  于 2023-01-27  发布在  Java
关注(0)|答案(1)|浏览(94)

我正试着写一个程序来检查长文本中是否存在一个键列表。
我使用文本,并将其作为单个String以1000行的形式提供给匹配器,每个String由\n换行符分隔。
在匹配的情况下,我调用match.start()来获取匹配符号的位置,但是它返回的位置不是新行,而是单个字符串。
下面是文本示例:

The Project Gutenberg EBook of The Adventures of Sherlock Holmes
by Sir Arthur Conan Doyle
(#15 in our series by Sir Arthur Conan Doyle)

Copyright laws are changing all over the world. Be sure to check the
copyright laws for your country before downloading or redistributing
this or any other Project Gutenberg eBook.

我用这个方法消费它:

public String readLinesBatch(int startLine, int step, String file) {
    try (Stream<String> lines = Files.lines(Paths.get(file))) {
        return lines.skip(startLine)
                .limit(step).collect(Collectors.joining(System.lineSeparator()));
    } catch (IOException e) {
        log.error("Exception while reading lines: {}", e.getMessage());
    }
    return "";
}

然后,我将它提供给Matcher方法:

public List<OffsetResult> matchV1(String source, Integer line) {
    List<OffsetResult> result = new ArrayList<>();
    Matcher match = Pattern.compile(String.join("|", keys))
            .matcher(source);
    while (match.find()) {
        int offsetStart = match.start();
        getLine(source, match.start());
        result.add(new OffsetResult(match.group(), line, offsetStart));
    }
    return result;
}

如果Arthur出现在我的密钥中,我收到的结果如下:

Arthur=[charOffset=72]

但是我需要的是它是7,因为Arthur世界发生在2行的第7个位置。
我在谷歌上搜索了一下,没有发现任何关于这个问题的信息。有人有什么想法吗?提前感谢!
UPD:我的偏移结果类

public class OffsetResult {

    private String key;
    private Integer lineOffset;
    private Integer charOffset;
}
uhry853o

uhry853o1#

你可以分割字符串,然后在每个字符串中找到位置,然后取例如first

Arrays.stream(input.split(String.format("%n")))
    .map(s -> someMethodReturningPositionOrNull(s))
    .filter(s -> s != null)
    .findFirst()
    .orElseGet(someDefaultValueOrNull)

或者扩展你的正则表达式以获取最后一个换行字符,就在搜索字符串之前(然后你还需要注意出现在第一个换行字符之前的字符串)

相关问题