所以,我对正则表达式很新。话虽这么说,我正在寻求帮助。我有这个正则表达式来做我想要的,但这很简单,因为我可以用我目前的理解。
(\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语法。这就是为什么我没有说明我使用的是什么。我认为这只是普通的正则表达式。此外,我目前的正则表达式完美无缺。我在这里要求的是关于简单性的课程(*
和?
更好地解释了)。我只觉得我目前的正则表达式很长很难看。
答案 0 :(得分:2)
?
使他们不情愿。这意味着只有当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仍然不知道我为什么被投票