0

所以,我对正则表达式相当陌生。话虽如此,我正在寻求帮助。我有这个正则表达式来做我想做的事,但这就像我目前的理解所能做到的那样简单。

(\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 中的内置查找/替换(使用正则表达式)将从 pdf 复制粘贴的文本转换为 python 语法。这就是为什么我没有具体说明我使用的是什么。我认为这只是普通的正则表达式。

此外,我当前的正则表达式完美运行。我在这里要求的是关于简单性的课程(*以及?更好的解释)。我只是觉得我当前的正则表达式又长又丑。

4

2 回答 2

2

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

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

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

[A-Z]除非所有先前[0-9]的 s 都已匹配,否则无法匹配。那为什么要[0-9]*舍不得呢?相反,通过删除?.

[0-9]*[A-Z]

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

.*?:[A-Z]+

会做的工作。然而,

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

更好地表示冒号将始终启动您想要匹配的事实。在这种情况下,我们“创造”了第一个条件(性格共性),因为我们意识到事实上从来不需要一个条件。IOW 我们从不需要.*匹配也:s,而只是[^:]*.

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

运用这些原则,

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

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

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

请参阅有关正则表达式的 Java 文档 以了解更多信息。

于 2013-08-18T00:15:21.723 回答
0

pswg 正确地指出 (.*) 是我需要的最简单的形式。我的正则表达式的其他 3 组足够具体,可以正常工作。谢谢pswg

PS仍然不知道为什么我被否决了

于 2013-08-18T02:22:30.927 回答