我想为扫描程序指定分隔符,该分隔符在某些模式上分割,但不会从标记中删除该模式。我似乎无法使这项工作,因为正则表达式识别的任何东西也被作为分隔符的一部分被吃掉。有什么建议吗?
我的具体问题,我的文件看起来像:
text/numbers mix
numbers
numbers
text/numbers mix
numbers
numbers
numbers
.
.
我想从文本/数字mix +行中分离,直到下一个文本/数字混合。我有正则表达式来识别它们,但正如所述,使用它作为分隔符吃掉了我想要的部分。
编辑:代码添加:
static final String labelRegex="\\s*[^01\\s*]\\w+\\s*";
static final Pattern labelPattern = Pattern.compile(labelRegex, Pattern.MULTILINE);
是我用来识别文本/数字位的模式(我知道我的数字行包含由空格分隔的所有1/0)。
初始化扫描仪时:
stateScan = new Scanner(new BufferedReader(new FileReader(source)));
stateScan.useDelimiter(labelPattern);
吃标签,然后离开行。我目前有一个工作实现,它在同一来源的两个缓冲文件读取器上启动两个扫描器,一个按州分开,另一个按标签分割。我真的希望它只是一个吸引人的标签+状态。
答案 0 :(得分:5)
您可以在正则表达式中使用积极的前瞻性。前方(和后方)不包含在比赛中,因此扫描仪不会“吃掉”它们。 这个正则表达式可能会做你想要的:
(?=text/numbers)
分隔符将是子字符串text/numbers
之前的空字符串。
这是一个小型演示:
public class Main {
public static void main(String[] args) {
String text = "text/numbers mix\n"+
"numbers\n"+
"numbers\n"+
"text/numbers mix\n"+
"numbers\n"+
"numbers\n"+
"numbers";
String regex = "(?=text/numbers)";
Scanner scan = new Scanner(text).useDelimiter(regex);
while(scan.hasNext()) {
System.out.println("------------------------");
System.out.println(">"+scan.next().trim()+"<");
}
}
}
产生:
------------------------
>text/numbers mix
numbers
numbers<
------------------------
>text/numbers mix
numbers
numbers
numbers<