简化我的Eclipse正则表达式

时间:2013-08-17 20:07:14

标签: regex

所以,我对正则表达式很新。话虽这么说,我正在寻求帮助。我有这个正则表达式来做我想要的,但这很简单,因为我可以用我目前的理解。

(\w+\s*?\w+\s*?\-*?/*?\w+)\s*?(\(\w+\))

这需要匹配的是以下字符串配置:

word
word word
word-word
word/word
word word/word
word word/LL
word word (word)
word-word word/word

我觉得我在滥用*?但是我看到了一个使用它的例子,它似乎做了我需要的事情。我也看到只有*才会这样做?或者只是??无论如何它就是。提前谢谢!

此外,分组是存在的,因为这个正则表达式实际上与其他组相比要长得多。请记住这一点。我需要小组仍与其他人合作(总共4人)。

编辑:对不起大家。我实际上是尝试使用Eclipse IDE中内置的find / replace(使用正则表达式)将从pdf复制粘贴的文本转换为python语法。这就是为什么我没有说明我使用的是什么。我认为这只是普通的正则表达式。

此外,我目前的正则表达式完美无缺。我在这里要求的是关于简单性的课程(*?更好地解释了)。我只觉得我目前的正则表达式很长很难看。

2 个答案:

答案 0 :(得分:2)

其他RegEx量词之后的

?使他们不情愿。这意味着只有当RegEx的其余部分无法匹配时,它们才会匹配输入。

当它应用的字符集与下面的集合没有共同字符时,不情愿的?是多余的。例如:

[0-9]*?[A-Z]

除非之前的所有[A-Z]都匹配,否则[0-9]无法匹配。那为什么让[0-9]*不情愿?相反,通过删除?使其变得贪婪。

[0-9]*[A-Z]

第二种情况是?被滥用。例如,您知道某些文本包含冒号后跟大写单词。没有其他可能出现的结肠。

.*?:[A-Z]+

会做这个工作。 Hoevever,

[^:]*:[A-Z]+

表示冒号总是会启动您想要匹配的事实。在这种情况下,我们通过意识到实际上从未需要一个来“创造”第一个条件(字符共性)。我们以前从未需要.*匹配:,但仅[^:]*

我不愿意使用不情愿的操作符,因为有时它会模糊模式而不是澄清它们,也因为性能影响,这都要归功于它极大地增加了回溯的水平(并且没有理由)。 / p>

应用这些原则,

(\w+\s*\w+\s*\-*/*\w+)\s*(\(\w+\))

似乎是一个更好的选择。此外,您在某些时候使用\-*/*。如果没有像(正面)示例那样多的反例(在开发和测试任何RegEx时这非常重要!),很难知道你真正想要的是什么,但是你真的想接受许多-的跟随也许很多/ s?我的印象是,您要找的是一个-或一个/或一个空格。 [ \-/]会做得更好。或者\s*[\-/]?\s*如果你想接受多个空格,甚至在[\-/]

之前和/或之后
(\w+\s*\w+\s*[\-/]?\s*\w+)\s*(\(\w+\))

请参阅正则表达式的the Java documentation以了解更多信息。

答案 1 :(得分:0)

p.s.w.g指出(。*)是我需要的最简单的形式是正确的。我的正则表达式的另外3个分组是足够具体的,这是有效的。谢谢p.s.w.g。

PS仍然不知道我为什么被投票