在正则表达式中排除某个特定的双字符

4
我有困难理解一个正则表达式。
到目前为止,我的模式看起来像这样(Python Verbose风格的正则表达式)
(?P<text>
 [a-zA-Z0-9]+        # can start with "core char"
 [a-zA-Z0-9\ \-]*     # can have a "core char" or space|dash within it
 [a-zA-Z0-9]+        # must end with a "core character"
)

我希望在中间部分更改,不匹配重复的空格或破折号。文本中有多个空格/破折号是可以接受的。
hello world
hello-world
h-ll-w-rld

不好:

-hello-world
hello--world
h-ll--w-rld
hello  world

1
一个简单的方法可能是只需添加第二个正则表达式来重新测试通过第一个正则表达式的字符串是否有双空格/破折号。虽然不是非常高效,但编写起来简单快捷。 - David says Reinstate Monica
2
你能不能把中间的 * 去掉,hello-wo-rld 可以吗? - Kevin DiTraglia
@Dgrin91的建议可能会带来很小的速度损失,但可以使您的代码更易读、模块化和易于维护。 - ajp15243
1
@KevinDiTraglia不行,因为这样hello-w-orld会失败,尽管它应该可以工作。 - David says Reinstate Monica
正确的,“hello-w-orld”应该可以工作。我不想做第二个正则表达式,因为它会更难集成。代码设置为一个可配置的正则表达式对象实例。为了使用2个正则表达式(或运行2个正则表达式的函数),我必须重新设计模块本身和调用它的所有内容。 - Jonathan Vanasco
2个回答

6

试试这个:

(?P<text>
 [a-zA-Z0-9]+
 ([ -][a-zA-Z0-9]+)*
)

1
哦,对了,* 允许为0。在这种情况下,不用理我,我错了。 - David says Reinstate Monica
这个匹配了 0h。只有 h 应该被匹配。非常接近了。 - Jonathan Vanasco
为什么您不想要 0?确切的规则是什么?数字是否可以接受? - David Knipe

3

我认为这就是想法,他确实希望像这样的东西能够工作。也许一个更好的例子是类似于这样的东西。 - David says Reinstate Monica
@ctn 好的,我修复了那部分。虽然我不完全确定 OP 是否想匹配 h - Sam I am says Reinstate Monica
哦,那个可以。谢谢!我也考虑过使用你的原始想法,使用OR ^(([a-zA-Z0-9]+[\ \-]?)+|[a-zA-Z0-9]+)$ - Jonathan Vanasco
@SamIam 我只是提到了它。现在你的答案是最完整的 :) - ctn
谢谢!我从没想过将前两部分包装成一个组。 - Jonathan Vanasco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接