我目前正在编写一些可以分析物品/武器名称的东西(来自游戏)。
我想匹配这样的名字:
Windwalkers angry Leather Claws of Destruction
包含以下匹配组:
项目名称具有命名方案:
<> = required, [] = optional
[itemgroup] [adjective] < material name with spaces > [of [source]]
组,形容词和来源不包含任何空格。
我想出了这个:
(\w*) (\w*) (.+) of (.*)
根本不处理某些部分是可选的,如果匹配组总是保持不变,那么它也会很好,所以2总是那个可能性为空白的形容词。
感谢您的帮助。
答案 0 :(得分:2)
您可以将其拆分为一行中的部分:
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]
答案 1 :(得分:1)
你无法用正则表达式做你想要的事情,因为没有办法判断第一个单词是项目组,形容词还是材料名称的一部分。我认为正则表达式方法是错误的。相反,请考虑为允许的项目组创建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
}
是输入名称:
itemgroup
这将测试当前字符串是否以itemgroup开头。如果是,则从工作字符串中删除itemgroup,然后您可以使用您的形容词和材料列表执行类似操作。如果没有,工作字符串不会更改,但您可以查找形容词和材料。我唯一使用正则表达式的是“部分”。尝试使用正则表达式执行所有操作的优点是,您可以轻松地从任何允许的可能列表中添加或删除项目。 (当你到达输入的末尾时要小心;我上面的代码在itemgroup
附加了一个空格,因为我认为{{1}}必须跟一个空格,但这并不总是材料名称的情况。)
答案 2 :(得分:1)
以下正则表达式应该为您提供您所追求的值:
^(\w* )?(\w* )?(\w* \w*) of (\w*)$
这里唯一重要的假设是项目名称中只有一个空格('皮革爪') - 如果不是这样,那么我不相信这是可能的,因为使用正则表达式。也就是说,任何自动解析器都难以处理这种情况,除非你的问题没有提到固定的语法。
输入: Windwalkers angry Leather Claws of Destruction
<强>输出:强>
输入: Windwalkers Leather Claws of Destruction
<强>输出:强>
输入: Leather Claws of Destruction
<强>输出:强>
这些是我可以从您的问题中确定的唯一测试案例,但它会正确解析它们甚至保留相同的匹配组。
上的演示答案 3 :(得分:0)
\[([a-z A-Z]*)\]\s\[([a-z A-Z]*)\] <(.*)\>\s\[of\s\[([a-z A-Z]*)\]\]
这是正则表达式模式。我对你所谈论的选项部分有点困惑,但使用了|打电话或许可以帮助你和我提供的网站。
()被称为组,您可以从中解析内容。
这个网站对正则表达式来说太棒了!
编辑:对于可选部分,只需制作不同的正则表达式模式,如果一个失败,则ifelse到另一个适合另一个模式的模式。