从具有规则表达式的字符串中获取字符

时间:2018-07-19 14:03:38

标签: regex string

我正在尝试进行一个与字符(字母a-z或数字0-9字母)匹配的常规表达式,但只剩下4个字符。该字符串将始终如下所示:

1as3-4123-5fa12-4124-41aa-1123

我尝试了下一个常规表达式,但是它只返回第一个匹配项(在这种情况下为1as3)。如果我取出'-',它就可以正常工作,但是对于它们,我无法使其正常工作匹配不止一次。

/^\w{1,26}/g

我如何才能多次获得它?预先谢谢你!

3 个答案:

答案 0 :(得分:1)

您可以在此处使用正向前瞻:

/^[A-Za-z0-9\-]*(?=.{4}$)/g

Demo

[A-Za-z0-9\-]*模式将消耗尽可能多的字符,仅排除最后四个字符。

答案 1 :(得分:0)

如果您的意思是“他的字符串将总是看起来像这样”,因为它始终具有相同的长度,则可以使用character class并添加连字符,因为该字符与\w不匹配,并且会仅匹配前四个1as3

^[\w-]{1,26}

或者如果您总是匹配26个字符,请使用^[\w-]{26}

如果您只想匹配字母a-z或数字0-9(包括-,则可以使用^[a-z0-9-]{1,26},因为\w还要匹配下划线和大写字符。

如果您只想匹配[a-z0-9]而不匹配连字符,直到剩下4个字符[a-z0-9],则可以使用正向前行,该断言将断定右侧的字符是{{1}的4倍。 1}}在行[a-z0-9]的末尾加上可选的-

[a-z0-9]+(?=[a-z0-9-]*(?:-?[a-z0-9]){4}$)

答案 2 :(得分:0)

尝试以下模式:

import Data.Foldable(find)

nth :: Int -> [(Int, Int)] -> Int
nth n = get2ndIn2nd . findByIndex n
  where    
    findByIndex n xs = find ((n ==) . fst) $ zip [1..] xs 
    get2ndIn2nd p
        | (Just (_, (_, b))) <- p = b
        | otherwise = error "Boo!"

它匹配连字符(-)后面的字母和数字组。由于前面没有连字符,因此将排除最后4个字符。

经过Regex101

测试