【发布时间】:2013-09-05 04:25:02
【问题描述】:
我正在尝试使用 java 正则表达式来标记任何语言源文件。我希望列表返回的是:
- 话 (
[a-z_A-Z0-9]) - 空格
-
[()*.,+-/=&:]中的任何一个作为单个字符 - 和引号中的项目。
这是我目前的代码:
Pattern pattern = Pattern.compile("[\"(\\w)\"]+|[\\s\\(\\)\\*\\+\\.,-/=&:]");
Matcher matcher = pattern.matcher(str);
List<String> matchlist = new ArrayList<String>();
while(matcher.find()) {
matchlist.add(matcher.group(0));
}
例如,
"I" am_the 2nd "best".
返回:列表,大小 8
("I", ,am_the, ,2nd, ,"best", .)
这就是我想要的。但是,如果整个句子都被引用,除了句号:
"I am_the 2nd best".
返回:列表,大小 8
("I, ,am_the, ,2nd, ,best", .)
我希望它能够返回:列表,大小 2
("I am_the 2nd best", .)
如果这有意义的话。我相信它适用于我想要的一切,除了返回字符串文字(我想保留引号)。我从允许我实现这一目标的模式中遗漏了什么?
无论如何,如果有一个我看不到的更容易使用的模式,请帮助我。上面显示的模式是许多试验/错误的编译。非常感谢您的任何帮助。
【问题讨论】:
-
这看起来有点棘手,可能是您的要求不兼容。什么时候应该引用 1 对和引用 4 而不是引用 2?
-
您不能将具有相同字符的构造嵌套用于开始和结束并期望解析器理解其含义。这是模棱两可的。使用不同的字符开始和结束它可以工作,但是,您不能使用单个正则表达式评估来解析嵌套结构。
-
好吧,也许第二个有点不必要,我很抱歉将这个例子放在一起,但我可以使用类似的正则表达式来捕捉外部引号,例如“嗨,那里”。作为一个返回值,但要不然就给我我的所有作品,如第一个示例所示?我当前的代码仍会返回“嗨,那里”。作为一块而不是一个对象。
-
StreamTokenizer可以识别带引号的字符串。 -
添加了“文本解析”和“词法分析器”标签。
标签: java regex text-parsing lexer