【问题标题】:Regex match character before and after underscore正则表达式匹配下划线前后的字符
【发布时间】:2016-07-21 07:50:57
【问题描述】:

我必须编写一个匹配如下的正则表达式:

  • 字符串应以字母开头 - [a-zA-Z]
  • 字符串可以包含字母、空格、数字、_-(下划线和连字符)
  • 字符串不应以_-(下划线和连字符)结尾
  • 下划线字符前后不能有空格。

我想出了以下正则表达式,但它似乎不起作用

/^[a-zA-Z0-9]+(\b_|_\b)[a-zA-Z0-9]+$/

测试用例:

HelloWorld // Match
Hello_World //Match
Hello _World // doesn't match
Hello_ World // doesn't match
Hello _ World // doesn't match
Hello_World_1 // Match
He110_W0rld // Match
Hello - World // Match
Hello-World // Match
_HelloWorld // doesn't match
Hello_-_World // match

【问题讨论】:

  • 在这种情况下的第一步:构建具有所需输出的测试字符串数组。这既能让其他人更清楚,也能让你自动测试任何正则表达式。
  • “但它似乎不起作用”您还可以使用您的正则表达式发布给出错误答案的字符串吗?
  • 试试/^[a-zA-Z][a-zA-Z0-9_\-]+[a-zA-Z0-9]$/
  • 这不清楚:第 4 个条件没有意义,因为前 3 个条件意味着字符串中根本没有空格。我会使用^[a-zA-Z][a-zA-Z0-9_-]*[a-zA-Z0-9]$,或者,如果应该匹配 1 个字符输入,^(?!.*[_-]$)[a-zA-Z][a-zA-Z0-9_-]*$
  • "字符串应该以字母开头" 第一个回复:[a-zA-Z0-9] ...您需要真正考虑更多。

标签: javascript regex


【解决方案1】:

你可以使用

^(?!.*(?:[_-]$|_ | _))[a-zA-Z][\w -]*$

regex demo

解释

  • ^ - 字符串开头
  • (?!.*(?:[_-]$|_ | _)) - 在某些字符 (.*) 之后,不得在字符串 ([_-]$) 的末尾出现 ((?!...)) _-,也不能有空格+__+空间
  • [a-zA-Z] - 第一个匹配和使用的字符必须是 ASCII 字母
  • [\w -]* - 0+ 字 (\w = [a-zA-Z0-9_]) 字符或空格或 -
  • $ - 字符串结束

【讨论】:

  • 我现在看到你比我早一分钟 :-)
  • 对于匹配空字符串,可以使用这个小mod(在模式的消费部分周围有一个可选组:^(?!.*(?:[_-]$|_ | _))(?:[a-zA-Z][\w -]*)?$
  • 满足所有测试用例。谢谢
【解决方案2】:

你可以用这个:

^(?!^[ _-]|.*[ _-]$|.* _|.*_ )[\w -]*$

regex tester

对于测试用例,我使用修饰符 gm 来单独匹配每一行。

如果不应将 emtpy 字符串视为可接受,则将最终的 * 更改为 +

^(?!^[ _-]|.*[ _-]$|.* _|.*_ )[\w -]+$

各部分的含义

  • ^$ 匹配输入的开始/结束
  • (?! ):应该匹配的事物列表:
    • |:逻辑或
    • ^[ _-]:以这三个字符中的任何一个开头
    • .*[ _-]$:以这三个字符中的任何一个结尾
    • .* _: 空格后跟下划线
    • .*_: 下划线后跟空格
  • [\w -]:任何字母数字字符或下划线(也与\w 匹配)或空格或连字符
  • *: 零次或多次
  • +:一次或多次

【讨论】:

  • 与我的类似,但允许空字符串。
  • 确实,这是一个解释问题。我添加了一个+ 变体。
【解决方案3】:

这个怎么样?

^[a-zA-Z](\B_\B|[a-zA-Z0-9 -])*[a-zA-Z0-9 ]$

分解:

^               
[a-zA-Z]        allowed characters at beginning
(
 \B_\B          underscore with no word-boundary
|                 or
 [a-zA-Z0-9 -]  other allowed characters
)*
[a-zA-Z0-9 ]    allowed characters at end
$

【讨论】:

  • 像魅力一样工作。谢谢,我知道我错过了什么。干杯:)
  • 允许个字符和要求个字符是有区别的。此正则表达式需要开头有一个字符,结尾有另一个字符,这意味着它不会匹配单个字符输入,例如A
  • @PalSingh:只是为了确保:Hello_-WorldZ 输入的预期行为是什么?还有一个小问题:空字符串呢?
  • 是的,_- 是一种失败的情况。怎么匹配?​​
  • @PalSingh:看我的回答和this demo
【解决方案4】:

哦!我爱我一些正则表达式!

这行得通吗? /^[a-z]$|^[a-z](?:_(?=[^ ]))?(?:[a-z\d -][^ ]_[^ ])*[a-z\d -]*[^_-]$/i

我对规则 4 有点不确定——你的意思是下划线可以在 之前有一个空格, 两者都没有,但在 之前不能有空格em> 之后?

【讨论】:

  • 下划线前后不能有空格
  • 好的,我只想非常清楚您需要什么。有 4 种可能性(忽略引号字符,问号用于任何非空格字符): 1) "?_?" 2)“_?” 3) "?_" 4) "_" 哪些是可以接受的?
  • 好的。所以我的正则表达式应该可以工作。您能否将要测试的字符串放入原始帖子中? (或者,如果它们真的很长而且很复杂,就想出一些我们可以用来调试的例子。)
  • 两个问题:中间好像少了一个管道,这个正则表达式拒绝像A这样的单个字符输入。
  • 好的,我添加了对单个字符的支持。不过,我不确定您所说的管道丢失是什么意思。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
相关资源
最近更新 更多