【问题标题】:Regex: must start with a letter or a number but the rest can be anything正则表达式:必须以字母或数字开头,但其余可以是任何东西
【发布时间】:2012-03-06 22:11:52
【问题描述】:

我正在尝试构建一个模式以便在验证中使用。

我的目标是让第一个字符是字母或数字,其余的都是任何字符。

i.ex:

  1. A'r4nd0m!
  2. 9!h3ll0.
  3. b1llin6s

我想到了:[a-zA-Z0-9_/][.*]++

解决办法是什么?

谢谢!

【问题讨论】:

  • 字母或数字是[\pL\pN]

标签: php regex perl


【解决方案1】:

如果第一个数字是数字或字母,则为 ^[A-Za-z0-9]。 (^ 匹配字符串的开头。)对于其余部分,简单的 .* 就足够了,所以你有 ^[A-Za-z0-9].*

【讨论】:

  • 其余的都可以,.* 是多余的。
  • @tchrist 也许是这样,但这并没有错。如果你是反对者,我认为这有点苛刻。如果其他人投反对票,请解释原因?
【解决方案2】:

你可以稍微精简一下你的正则表达式:

^[a-zA-Z0-9].*

以字母/数字开头,可以是任意长度或后面的任意字符。

【讨论】:

  • 哎呀!首先,结尾的.* 完全是多余的,因此具有误导性。其次,一个字母或一个数字是[\pL\pN],任何时候你发现自己写了一个明确的范围,你几乎肯定做错了什么。
【解决方案3】:

您必须使用/^/ 将您的正则表达式锚定在字符串的开头。你的字符类[a-zA-Z0-9_/] 也匹配下划线和斜线:这是你想要的吗?此外,[.*]++ 匹配一个或多个点或星号,而结尾的 + 多余地重复了量词。

由于字符串的其余部分可以是“任何东西”,因此匹配它没有意义,并且

/^[A-Za-z0-9]/

会很好。

【讨论】:

  • 你好。谢谢你。这是我的错误,我不想匹配下划线和斜线。第一个字符只有数字和字母。
  • @tchrist:(你的名字是安妮吗?!)是的,但是\pL\pN 匹配的(国际)字符比[A-za-z][0-9] 匹配的字符多得多,而且这种行为可能不可取。
  • @Borodin 规范要求来信;一封信是\pL。规范要求提供一个数字;一个数字是\pN。我试图从 19 世纪消除愚蠢的打字机心态。没有国际化的性格。
  • @tchrist:规范还提出了一个简单的 ASCII 字母数字匹配;把你(19 世纪的打字机?)的使命留给自己。您很清楚international 用于multi-national 甚至foreign,尤其是在您所在的国家/地区。你在不必要地挑错,我会忽略你
【解决方案4】:

正如我所评论的,字母或数字是[\pL\pN]。因此,以其中一个开头的字符串将匹配模式

/^[\pL\pN]/

【讨论】:

  • 谢谢。为什么开头和结尾都是斜线?
  • @Phil 斜线只是对模式进行定界。他们不应该成为其中的一部分。如果你被 PHP 卡住了,你将不得不做一些更奇特的事情来让它正确地处理任意字符数据,比如在最后写一个/u。 Perl 当然没有这样的错误。
  • 谢谢。因为我需要所有可能的国际字符。我正在雇用你。但是,它使用 ^ 作为第一个字符似乎不适用于 Kohana 的 URI 系统,所以我最终得到: [\pL\pN].*
  • @Phil 这是一个绝妙的计划,删除^。那么,您的字符串现在是否检查字符串中的第一个字符?
  • @TMZ,令人惊讶的是,是的,在这种情况下,Kohana 的 URI 机制确实按照我需要的方式检查它。正如我所说,我正在使用的是:[\pL\pN].* 它有效!
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多