【问题标题】:Match a string with no white space in between text but may have leading spaces/zeros匹配文本之间没有空格但可能有前导空格/零的字符串
【发布时间】:2023-03-04 13:48:01
【问题描述】:

根据以下匹配的正则表达式

  • 最少 12 个或最多 13 个字符
  • 可以有前导空格/零
  • 字符串中没有空格
  • 并非全是零/空格

  • 正确匹配: “ABCDEFGHIJ” "ABCDEFGHIJKLM"

  • 错误匹配: "ABCD IJKL"

【问题讨论】:

  • 你能举一些例子吗(要解析的文本和要提取/检测的文本)
  • 我认为没有尾随空格?
  • @user2991913,我们的浏览器会自动规范化三个前导空格,所以看起来只有一个。我认为这就是为什么每个人都会得出结论,即您正在寻找 13 个字符或一个空格后跟 12 个字符。 CoverosGene 添加反引号并没有帮助,因为内联格式化机制仍需规范化。如果空格很重要,您必须使用代码格式化的块形式。
  • 顺便说一句,你的“正确”匹配,“ABCDEFGHIJ”有 11 个字符长,包括前导空格,这不适合你的第一个请求:P

标签: regex abap


【解决方案1】:

你是说整个字符串必须是 12 或 13 个字符长包括前导空格?这适用于大多数正则表达式风格:

^(?=.{12,13}$)\s*[A-Za-z0-9]+$

不过,我不确定 ABAP。我发现的许多搜索结果表明它支持前瞻,但如果你真的使用 POSIX 标准正则表达式,这将不起作用。您可能需要在单独的测试中进行长度检查。

更新:为了防止全零匹配,您需要添加另一个前瞻:

^(?=.{12,13}$)(?!0+$)\s*[A-Za-z0-9]+$

更新 2: 我突然想到你可能不想要像 " 000000000" 这样的字符串——即全零加上前导空格。这个正则表达式将涵盖:

^(?=.{12,13}$)(?!\s*0+$)\s*[A-Za-z0-9]+$

【讨论】:

  • 它不会匹配所有空格,因为[A-Za-z0-9]+ 必须至少匹配一个字母或数字。对于其他要求,请参阅我的更新。
【解决方案2】:

你可以使用这个正则表达式:

^ *[A-Za-z0-9]{12,13}$

【讨论】:

  • 谢谢,但我只允许一个前导空格它应该允许多个前导空格,例如“ABCDEFGH”
  • @user2991913:你确定它只允许 1 个空格吗?我有^ *,这意味着 0 或矿石前导空格。
  • 您使用哪种语言/工具来测试它?
  • REGEX_TOY 扩展正则表达式符合 POSIX 标准 1003.2。
【解决方案3】:
\s*\b[a-zA-Z0-9]{12,13}\b

这并不要求字符串在自己的行上。如果您实际上并不关心匹配初始空格,则可以摆脱 \s*

【讨论】:

  • 如果您匹配的字符串在自己的行上,那么@anubhava 的答案就是您想要的。
【解决方案4】:

您只需要可选的前导空格:

\s*[A-Za-z0-9]{12}

【讨论】:

  • 他在对 Anubhava 的回答的评论中特别指出,它不限于一个前导空格。
  • @Tobberoth 愚蠢地读了这个问题。将? 更改为*
  • 这使它成为以前答案的副本,这些答案一开始甚至都不正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
  • 2012-06-30
  • 2017-04-16
  • 2012-10-09
相关资源
最近更新 更多