首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于字符串的RegEx,用于获取没有空格的单词,但其中一部分可以使用

用于字符串的RegEx,用于获取没有空格的单词,但其中一部分可以使用
EN

Stack Overflow用户
提问于 2013-08-20 22:51:39
回答 4查看 736关注 0票数 0

一开始:对不起标题,不知道什么更好。另外,我对正则表达式相当陌生。

我目前正在编程一个小东西,可以分析一个项目/武器的名称(从一个游戏)。

我想和这个名字相匹配:

代码语言:javascript
复制
Windwalkers angry Leather Claws of Destruction

具有下列匹配组:

  1. 风行者
  2. 愤怒
  3. 皮爪
  4. 破坏

项目名称有一个命名方案:

代码语言:javascript
复制
<> = required, [] = optional
[itemgroup] [adjective] < material name with spaces > [of [source]]

组,形容词和源将不包含任何空格。

我想出了这个:

代码语言:javascript
复制
(\w*) (\w*) (.+) of (.*)

它根本不处理一些部分是可选的,如果比赛组总是保持不变,那么2将永远是形容词,并且可能是空白。

谢谢你的帮助。

EN

回答 4

Stack Overflow用户

发布于 2013-08-20 22:57:20

你可以把它分成一行:

代码语言:javascript
复制
String[] parts = str.split("(?<!Leather|Steel|Wood(en)?|Glass|Iron|Bronze) (of )?");

你可以随心所欲地增加多少形容词。

这使用了一个消极的后视镜来断言被分割的空间之前没有一个形容词。可选的(of )?使用术语之间的"of“。

下面是一个测试:

代码语言:javascript
复制
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));

输出:

代码语言:javascript
复制
[Windwalkers, angry, Leather Claws, Destruction]
票数 2
EN

Stack Overflow用户

发布于 2013-08-20 23:45:31

你不能用regexes来做你想做的事,因为你无法判断第一个单词是一个项目组,一个形容词,还是一个物质名称的一部分。我认为regex方法是错误的。相反,考虑为允许的项目组创建一个List<String>,为形容词创建另一个List<String>,为实体名称创建另一个List<String>。然后,如果input是输入名称:

代码语言:javascript
复制
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后面必须有一个空格,但材料名的情况并不总是这样。)

票数 1
EN

Stack Overflow用户

发布于 2013-08-21 08:56:34

下面的regex应该给出您想要的值:

代码语言:javascript
复制
  ^(\w* )?(\w* )?(\w* \w*) of (\w*)$

这里唯一重要的假设是,项目名称中只有一个空间(‘皮革爪’)--如果不是这样,那么我认为使用正则表达式是不可能的。也就是说,在任何自动解析器上都很难处理这种情况,除非您的问题没有提到固定的语法。

输入: Windwalkers angry Leather Claws of Destruction

输出:

  1. 风行者
  2. 愤怒
  3. 皮爪
  4. 破坏

输入: Windwalkers Leather Claws of Destruction

输出:

  1. 风行者
  2. 皮爪
  3. 破坏

输入: Leather Claws of Destruction

输出:

  1. 皮爪
  2. 破坏

这是我能从你的问题中确定的唯一测试用例,但它正确地分析了它们,甚至保持了相同的匹配组。

参见http://www.rubular.com/r/7AT4kDVf8S演示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18346209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档