一开始:对不起标题,不知道什么更好。另外,我对正则表达式相当陌生。
我目前正在编程一个小东西,可以分析一个项目/武器的名称(从一个游戏)。
我想和这个名字相匹配:
Windwalkers angry Leather Claws of Destruction具有下列匹配组:
项目名称有一个命名方案:
<> = required, [] = optional
[itemgroup] [adjective] < material name with spaces > [of [source]]组,形容词和源将不包含任何空格。
我想出了这个:
(\w*) (\w*) (.+) of (.*)它根本不处理一些部分是可选的,如果比赛组总是保持不变,那么2将永远是形容词,并且可能是空白。
谢谢你的帮助。
发布于 2013-08-20 22:57:20
你可以把它分成一行:
String[] parts = str.split("(?<!Leather|Steel|Wood(en)?|Glass|Iron|Bronze) (of )?");你可以随心所欲地增加多少形容词。
这使用了一个消极的后视镜来断言被分割的空间之前没有一个形容词。可选的(of )?使用术语之间的"of“。
下面是一个测试:
String str = "Windwalkers angry Leather Claws of Destruction";
String[] parts = str.split("(?<!Leather|Steel|Wood(en)?|Glass|Iron|Bronze) (of )?");
System.out.println(Arrays.toString(parts));输出:
[Windwalkers, angry, Leather Claws, Destruction]发布于 2013-08-20 23:45:31
你不能用regexes来做你想做的事,因为你无法判断第一个单词是一个项目组,一个形容词,还是一个物质名称的一部分。我认为regex方法是错误的。相反,考虑为允许的项目组创建一个List<String>,为形容词创建另一个List<String>,为实体名称创建另一个List<String>。然后,如果input是输入名称:
String work = input;
for (String itemgroup : itemgroupList)
if (work.startsWith (itemgroup.concat (" ")) {
// itemgroup is now the item group you want
work = work.substring (itemgroup.length()).trim();
// remove itemgroup from the front of work, and discard leftover leading
// spaces
}这将测试当前字符串是否以项目组开头。如果是这样的话,它会从工作字符串中删除项目组,然后您可以对您的形容词和材料列表做一些类似的事情。如果没有,工作字符串不会改变,但你可以寻找形容词和材料。我唯一会用正则表达式的是"of“部分。与尝试使用regexes完成任何事情相比,这样做的好处是可以轻松地从任何允许的可能性列表中添加或删除项。(当您到达输入的末尾时要小心;我上面的代码在itemgroup中添加了一个空格,因为我认为itemgroup后面必须有一个空格,但材料名的情况并不总是这样。)
发布于 2013-08-21 08:56:34
下面的regex应该给出您想要的值:
^(\w* )?(\w* )?(\w* \w*) of (\w*)$这里唯一重要的假设是,项目名称中只有一个空间(‘皮革爪’)--如果不是这样,那么我认为使用正则表达式是不可能的。也就是说,在任何自动解析器上都很难处理这种情况,除非您的问题没有提到固定的语法。
输入: Windwalkers angry Leather Claws of Destruction
输出:
输入: Windwalkers Leather Claws of Destruction
输出:
输入: Leather Claws of Destruction
输出:
这是我能从你的问题中确定的唯一测试用例,但它正确地分析了它们,甚至保持了相同的匹配组。
参见http://www.rubular.com/r/7AT4kDVf8S演示
https://stackoverflow.com/questions/18346209
复制相似问题