Java - Groovy:正则表达式解析文本块

时间:2015-12-13 15:58:58

标签: java regex groovy

我知道这是一个常见的问题,我已经通过很多论坛来弄清楚我的代码中的问题是什么。

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

void Clickthis1 (object sender, EventArgs args)
{
    var CategoryName = new StartPage();

    CategoryName.TheCategoryName ("Beatrice", /* the list here?*/);

    Navigation.PushAsync (CategoryName);
}

void Clickthis2 (object sender, EventArgs args)
{
    var CategoryName = new StartPage();

    CategoryName.TheCategoryName ("Anna", /* the list here?*/);


    Navigation.PushAsync(CategoryName);
}

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

List<createSomething> ourPitems = new List<createSomething>();


public StartPage ()
{
    InitializeComponent ();
}

public class createSomething
{
    public string ourUsername {get; set;}
}


public void TheCategoryName (String pHeader, /*New list added here???*/)
{

    personHeader.Text = pHeader;

}

protected override void OnAppearing(){
getItems (); }

async void getItems () 
{
var getItems = await parseAPI.myInfo (Application.Current.Properties 
["sessionToken"].ToString ());
EmployeeList.ItemsSource = null;



ourPitems = new List<createSomething> ();

foreach (var currentItem in getItems["results"]) 
{
ourPitems.Add (new createSomething ()


{

ourUsername = currentItem ["YourName"].ToString (),
});}

EmployeeList.ItemsSource = ourPitems;

}

layoutBlock返回size = 1

1 个答案:

答案 0 :(得分:1)

我认为这可能是一个所谓的XY问题......如果groovy源只由@Layout带注释的代码块组成,你可以使用一个调和的贪婪令牌来选择直到下一个注释(view online demo)。

将模式loc更改为:

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

PS :正则表达式中的dotall标志(?s)和参数Pattern.DOTALL执行相同的操作(启用所谓的多行模式) ,只使用其中一个无差别。

<强>更新

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

添加到allText时,只需读取换行符:

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

或者您可以使用以下代码替换所有代码以篡改文件:

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);