【问题标题】:Dividing words into 2 parts: letters and numbers将单词分成两部分:字母和数字
【发布时间】:2014-04-15 17:17:21
【问题描述】:

有字符串:

$string1 = "text3256";
$string2 = "23PT";

我想以某种方式检查单词是否属于模式“NumberText”或“TextNumber”,以便将单词分成两部分:“数字”和“文本”

在上面的例子中 - 单词应分为以下几部分:

"text3256" -> "text" and "3256"
"23PT" -> "23" and "PT"

是否可以创建这样的正则表达式模式? (“text32text”或“44fd675”等词不得分割)..

我当然可以使用“每个字符迭代”方法创建一个硬编码解决方案,并检查下一个字符是字母还是数字.. 这是一个硬核,所以,我想知道是否有人可以帮助我更好,更简单的解决方案?

【问题讨论】:

    标签: php regex


    【解决方案1】:

    你可以使用:

    '/^(?:(?:([a-z]+)(\d+))|(?:(\d+)([a-z]+)))$/i'
    

    【讨论】:

    • 这似乎是WordNumberWord 格式的单词有问题,例如foo123bar 匹配foo123。你可以在这里看到结果:codepad.viper-7.com/vHY28F
    • 但是OP没有写:words such as "text32text" or "44fd675" shall not be divided)
    • 是的,但你正在分裂。 foo123bar 匹配为 foo123。问题是您的正则表达式匹配^(?:([a-z]+)(\d+))(?:(\d+)([a-z]+))$。锚点包含在 or (|) 的每一侧。所以你匹配(开头后跟数字然后字母)或(字母后跟数字然后结尾)。你应该在你的模式周围加上括号,比如^((?:([a-z]+)(\d+))|(?:(\d+)([a-z]+)))$。 @AmalMurali 也有同样的问题。
    • 啊,非常感谢,好点,这是我的愚蠢错误,现在已修复。
    【解决方案2】:

    我更喜欢使用边界:

    /\b((\d+)([a-z]+)|([a-z]+)(\d+))\b/i
    

    示例:http://codepad.viper-7.com/8muVjE

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-26
      • 1970-01-01
      • 2023-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 1970-01-01
      相关资源
      最近更新 更多