2010-03-03 30 views
0

我试图找到一种很好的方法来让扫描程序使用给定的分隔符作为标记。例如,我想将一段文本拆分为数字和非数字块,所以理想情况下,我只需将分隔符设置为\D并设置一些标志,如useDelimiterAsToken,但在简要查看API后,我将没有提出任何事情。现在,我不得不求助于使用组合向前看符号/ lookbehinds的分隔符,这是有点痛苦:Java:使用扫描器分隔符作为标记

scanner.useDelimiter("((?<=\\d)(?=\\D)|(?<=\\D)(?=\\d))"); 

这看起来从一个数字,非数字或反之亦然任何过渡。有没有更健全的方式来做到这一点?

+0

请参阅:http://stackoverflow.com/questions/2206378/how-to-split-a-string-but-also-keep-the-delimiters,也许它有帮助。 – 2010-03-03 11:53:11

+0

问题是,如果我为'\ d'或'\ d +'做了同样的事情,它会在太多的地方匹配 – daltonb 2010-03-03 12:16:58

回答

1

编辑:编辑的问题是如此不同,我原来的答案根本不适用。为了记录,你在做什么解决你的问题的理想方式,在我看来。您的分隔符是数字与非数字之间的零宽度边界,并且没有比您发布的内容更简洁的表达方式。

EDIT2:(针对在注释中提出的问题。)您最初问这个的替代正则表达式:

"((?<=\\w)(?=[^\\w])|(?<=[^\\w])(?=\\w))" 

这几乎是究竟如何\b,字边界构造,工作原理:

"(?<=\\w)(?!\\w)|(?<!\\w)(?=\\w)" 

也就是说,位置的前面是一个单词字符,后面跟一个单词,后面跟一个单词字符,前面没有一个单词。区别在于\b可以在输入的开始和结束处匹配。你显然不希望出现这种情况,所以我加了lookarounds排除这些条件:

"(?!^)\\b(?!$)" 

这只是一个更简洁的方式做你的正则表达式做了什么。但是后来您将要求更改为匹配数字/非数字边界,并且对于单词/非单词边界不存在像\b那样的简写。

+0

它们已经在我正在使用的正则表达式中被阻止了。 – daltonb 2010-03-03 12:03:55

+0

我知道,我只是建议使用较短的正则表达式来完成同样的事情。但是你改变了要求,所以现在不相关。 – 2010-03-03 12:10:36

+0

对于您的解决方案在第一种情况下的帮助,我仍然有点困惑。现在,除了数字而不是单词外,现在的问题是相同的。我只是不希望单词边界成为一个选项,因为我实际上正在做一些更复杂的事情。 – daltonb 2010-03-03 12:12:34