gpt4 book ai didi

Java-Groovy : regex parse text block

转载 作者:搜寻专家 更新时间:2023-11-01 03:35:11 27 4
gpt4 key购买 nike

我知道这是一个常见问题,我浏览了很多论坛来找出我的代码中的问题所在。

我必须按以下格式读取包含多个 block 的文本文件:

import com.myCompanyExample.gui.Layout

/*some comments here*/

@Layout
LayoutModel currentState() {
MyBuilder builder = new MyBuilder()
form example
title form{
row_1
row_1
row_n
}
return build.get()
}

@Layout
LayoutModel otherState() {
....
....
return build.get()
}

我有这段代码可以读取所有文件,我想提取关键字“@Layout”和关键字“return”之间的每个 block 。我还需要捕获所有换行符,以便稍后我可以将每个匹配的 block 拆分为一个列表

private void myReadFile(File fileLayout){
String line = null;
StringBuilder allText = new StringBuilder();
try{
FileReader fileReader = new FileReader(fileLayout);
BufferedReader bufferedReader = new BufferedReader(fileReader);
while((line = bufferedReader.readLine()) != null) {
allText.append(line)
}
bufferedReader.close();
}
catch(FileNotFoundException ex) {
System.out.println("Unable to open file");
}
catch(IOException ex) {
System.out.println("Error reading file");
}
Pattern pattern = Pattern.compile("(?s)@Layout.*?return",Pattern.DOTALL);
Matcher matcher = pattern.matcher(allText);
while(matcher.find()){
String [] layoutBlock = (matcher.group()).split("\\r?\\n")
for(index in layoutBlock){
//check each line of the current block
}
}

layoutBlock 返回 size=1

最佳答案

我认为无论如何这可能是一个所谓的 XY 问题...如果 groovy 源仅由 @Layout 注释的代码块组成,您可以使用一个缓和的贪婪标记来选择直到下一个注释(查看 online demo )。

将模式 loc 更改为:

Pattern pattern = Pattern.compile( "@Layout(?:(?!@Layout).)*", Pattern.DOTALL );

PS:正则表达式中的 dotall 标志 (?s) 和参数 Pattern.DOTALL 做同样的事情(启用 so称为多行模式),只使用其中一个无关紧要。

更新

我试过你的代码,问题(保留换行符)出在你用来读取文件的方法中(bufferedReader.readline() 删除字符串末尾的换行符)。

添加到 allText 时简单地读取一个换行符:

String ln = System.lineSeparator();
while((line = bufferedReader.readLine()) != null) {
allText.append(line + ln);
}

或者您可以将所有代码替换为 slurp 文件:

import java.nio.file.Files;
import java.nio.file.Paths;

//can throw an IOException
String filePath = "/path/to/layout.groovy";
String allText = new String(Files.readAllBytes(Paths.get(filePath)),StandardCharsets.UTF_8);

关于Java-Groovy : regex parse text block,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34253064/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com