【问题标题】:Regex to match several groups of a-zA-Z0-9- but not 2 consecutive underscores __正则表达式匹配多组 a-zA-Z0-9- 但不是 2 个连续的下划线 __
【发布时间】:2019-02-12 04:54:29
【问题描述】:

我有几个字符串,通常是单词和字母,大写和小写,还有数字。除非字符串中有两个连续的下划线,否则我想将它们全部匹配。我的字符串示例:

first-string-String-71-word
second-otherword-X-17-word-last-word
third-nextword-8-word__otherword

现在我正在搜索匹配第一个和第二个但不匹配第三个的正则表达式。

([a-zA-Z0-9-]+) 
(?!__)([a-zA-Z0-9-]+)
([a-zA-Z0-9-^(__)]+)

这些似乎都不起作用 - 这里的正确方法是什么?

https://regex101.com/r/i7AnSS/1

【问题讨论】:

  • 你想匹配单个下划线吗?
  • 每行只有一个字符串,没有空格吗?或者你有类似“句子”的东西?
  • 对于用连字符分隔单词的示例字符串,请尝试^[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)+$,请参阅demo

标签: regex


【解决方案1】:

您可以在字符串中为两个连续的_ 添加负前瞻。请注意,您需要将正则表达式锚定到字符串的开头和结尾,否则它可以从中途匹配。

^(?!.*?__)([a-zA-Z0-9_-]+)$

https://regex101.com/r/i7AnSS/3

请注意,这假设您的字符串 允许在其中包含单个 _。如果不是这样,那么简单

^([a-zA-Z0-9-]+)$

将排除其中包含_ 的任何字符串。

【讨论】:

  • 或许\b^/$ 更灵活一点?
  • @jhnc 关于使用\b 的唯一问题是它可以匹配-,如果它出现在字符串的开头或结尾。我不确定这是否会成为问题。
  • 如果接受的字符集不包含下划线,那么否定的向前看是多余的。
  • @PushpeshKumarRajwanshi 你是对的,如果字符串被锚定在两端,它确实是多余的,除非 OP 想要匹配 _。如果他没有(等待看到对问题评论的回复)我会删除。
  • @PushpeshKumarRajwanshi 我在答案中添加了一条注释(并更新了初始正则表达式)以涵盖单一的_ 情况。感谢您的意见。
【解决方案2】:

使用它

^([a-zA-Z0-9-]+)$

并在 URL https://regex101.com/r/u82mre/1 上检查它

【讨论】:

    猜你喜欢
    • 2015-01-07
    • 2021-11-09
    • 2010-12-11
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多