被正则搞得脑袋大

49 阅读3分钟

起因

事情的起因是,产品需要一个数字输入框的校验范围更改,并要求一小时内完成修改,测试,上线。当然,没完成,用了一下午才完成上线。时间紧张的情况下,面临不断变更的范围(由于各种原因短时间内更改了三四次),我需要不断的变更正则表达式去符合要求,多年前学的正则基础忘得已经所剩无几了,不出意外,一脑袋汗的找人工智能要正则。在完成需求之后,马上开始了正则的学习。

什么是正则?

正则表达式(Regular Expression,简称 regexregexp)是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子,通俗的讲就是按照某种规则去匹配符合条件的字符串。正则表达式被广泛应用于各种文本处理任务,如搜索、替换、验证等。

基础语法

下面是一些正则表达式的基本概念和常见用法:

  • .:匹配任意字符(除了换行符)
  • ^:匹配字符串的开始
  • $:匹配字符串的结束
  • *:匹配前面的子表达式零次或多次
  • +:匹配前面的子表达式一次或多次
  • ?:匹配前面的子表达式零次或一次
  • {n}:匹配前面的子表达式恰好 n 次
  • {n,}:匹配前面的子表达式至少 n 次
  • {n,m}:匹配前面的子表达式至少 n 次,但不超过 m 次
  • []:匹配方括号中的任意一个字符
  • [^]:匹配不在方括号中的任意一个字符

更多的正则表达式: 正则表达式手册

常见用法

  1. 匹配数字\d 或 [0-9]
  2. 匹配字母\w(包括数字、字母和下划线)或 [a-zA-Z](仅匹配字母)
  3. 匹配空白字符\s(包括空格、制表符、换页符等)
  4. 匹配非空白字符\S
  5. 匹配特定字符串:直接写字符串即可,如 hello 匹配 "hello"
  6. 选择匹配:使用 | 符号,如 a|b 匹配 "a" 或 "b"
  7. 分组:使用括号 (),如 (ab)+ 匹配一个或多个 "ab"
  8. 引用分组:使用 \n(n 是分组的序号),如 (a)b\1 匹配 "aba"

例子解析

  • 匹配日期(YYYY-MM-DD 格式):\d{4}-\d{2}-\d{2}
  • 匹配以"abc"开头,后面跟着任意字符,并以"xyz"结尾的字符串:^abc.*xyz$
  • 匹配0-1000的整数或者两位小数(包含0、0.0、0.00、1000、1000.0、1000.00)的正则表达式
//0-1000的整数或者两位小数(包含0、0.0、0.00、1000、1000.0、1000.00)
/^(([1-9]\d{1,2}(\.\d{1,2})?)|\d((\.\d{1,2})?)|1000|1000.0|1000.00)$/
  • ^:表示字符串的开始
  • |:或操作符,表示匹配前面的模式或后面的模式
  • $:表示字符串的结束
  1. ([1-9]\d{1,2}(.\d{1,2})?)
  • [1-9]:匹配一个非零的数字(1到9)。
  • \d{1,2}:匹配一个或两个数字(0到9)。
  • (.\d{1,2})?:可选地匹配一个小数点后跟一个或两个数字。例如,它可以匹配123123.4123.45,但不能匹配012123.456
  1. |\d((.\d{1,2})?)
  • \d:匹配一个数字(0到9)。
  • ((.\d{1,2})?):与上面的部分相同,但这次前面的数字可以是0。因此,它可以匹配00.10.1211.21.23
  1. |1000:直接匹配字符串1000
  2. |1000.0:直接匹配字符串1000.0
  3. |1000.00:直接匹配字符串1000.00

可以进行简化 |1000|1000.0|1000.00可以替换为|1000(\.0{1,2})?

犹豫 |\d((.\d{1,2})?)和前面一部分重复了,这里其实只需要匹配0.x和0.xx所以此处可以改为0(\.\d{1,2})?

因此正则表达式可以更改为/^(([1-9]\d{1,2}(\.\d{1,2})?)|0(\.\d{1,2})?|1000(\.0{1,2})?)$/

总结

正则表达式的具体语法和用法可能因不同的编程语言或工具而略有差异,但基本的元字符和概念是通用的。在使用正则表达式时,建议先明确自己的需求,然后根据需求选择适当的元字符和模式来构建正则表达式。正则很灵活,可能同一个需求,写很长也能匹配,简短一个正则也可以匹配。对于基本的语法和字符,我们也要能看明白,不能太依赖人工智能。