2

正则表达式合集帖(希望本帖能存活十年以上)

 1 month ago
source link: https://www.v2ex.com/t/1027988
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

V2EX  ›  程序员

正则表达式合集帖(希望本帖能存活十年以上)

  oakland · 7 小时 15 分钟前 · 2782 次点击
  1. 欢迎大家在这篇文章下面评论留言,给出自己在日常 coding 的过程中写过的正则表达式,并给出说明和示例,注明对应的语言,如果能给出如何写出来的详细解释更好。
  2. 欢迎大家留言给出自己想要实现的正则表达式(注明语言),然后群友给 ta 解答。
  3. 欢迎大家“优化”已经留言的正则表达式。
  4. 我希望这篇文章成为所有 “讨厌” 和 “喜爱” 正则表达式的同学的聚集地,并最终能让所有人理解和熟悉正则表达式。
46 条回复    2024-03-29 16:45:26 +08:00
zapper

zapper      7 小时 13 分钟前

关于 2 和 3 ,为什么我不去问神奇的 GPT 呢
Kaiv2

Kaiv2      7 小时 10 分钟前   ❤️ 1

lua 语言,jdtls 取 Class 名称

%[([%a%$_]?[%.%w%(%)*"+,\\_%[%]%s :%-@<>]*)%]%(jdt://[^%)]+%)

测试字符 [String](jdt://xxxxxxxx)
ShinichiYao

ShinichiYao      7 小时 10 分钟前   ❤️ 5

自从有了 ChatGPT 再也不用烦心正则怎么写了
oakland

oakland      7 小时 9 分钟前

/^(\+|-)?\d+(\.\d+)?(E(\+|-)?\d+)?$/i

我先来一个,这个表示所有 JavaScript 中的所有数字格式,可以带正负号,可以是整数,可以是浮点数,可以是带 E|e 的科学计数法格式。比如
“1”
“+1”
“-1”
“-2.4879983487”
“2.34E-2”(表示 2.34 * 10^-2 ,也就是 0.0234)
“2.34e3”(表示 2340)
oakland

oakland      7 小时 7 分钟前

@zapper 支持直接粘贴 chatgpt 的回答,也希望大家能帮 chatgpt 找 bug ,但我希望是 4 ,这个对大家作为 programmer 有帮助。
oakland

oakland      7 小时 5 分钟前

@Kaiv2 好酷,有空的时候欢迎给出详细的解释
DavidDee

DavidDee      7 小时 5 分钟前

/^-?\d+(\.\d+)?(e-?\d+)?$/i
/^-?\d+(\.\d+)?(e[+-]?\d+)?$/i
@oakland #4 gpt3.5 的答案,不知道对不对
igeeky

igeeky      7 小时 4 分钟前

# 下面的正则是把用户输入的(无意义)大于 2 个字的重复的内容变成单个. 没想到有什么好的,简单的算法实现. 使用正则就比较简单.(python 代码)
userInputText = """
测试测试测试
哈哈哈哈哈哈哈哈哈哈哈哈
哈哈哈
你在干嘛呢?你在干嘛呢?你在干嘛呢?你在干嘛呢?你在干嘛呢?你在干嘛呢?你在干嘛呢?你在干嘛呢?你在干嘛呢?
"""
import re
regex = r"(?P<r>.{2,100}?)(?P=r){2,}"
subst = "\\1"
outputText = re.sub(regex, subst, userInputText, 0, re.MULTILINE)
print("## input")
print(userInputText)
print("## output:")
print(outputText)

# 输出:

## input

测试测试测试
哈哈哈哈哈哈哈哈哈哈哈哈
哈哈哈
你在干嘛呢?你在干嘛呢?你在干嘛呢?你在干嘛呢?你在干嘛呢?你在干嘛呢?你在干嘛呢?你在干嘛呢?你在干嘛呢?

## output:

测试
哈哈
哈哈哈
你在干嘛呢?
oakland

oakland      7 小时 2 分钟前

@DavidDee 这个回答不支持开头为 “+” 的这种格式,比如 “+1”,覆盖范围不全
oakland

oakland      7 小时 1 分钟前

@igeeky 哈哈哈哈哈哈,你在干嘛呢?你在干嘛呢?测试!测试!
nagisaushio

nagisaushio      6 小时 59 分钟前 via Android

@oakland .1 似乎表示不了
nagisaushio

nagisaushio      6 小时 56 分钟前 via Android   ❤️ 1

@oakland 还有三个特殊值 NaN +-Infinity
nagisaushio

nagisaushio      6 小时 54 分钟前 via Android

@oakland 1. 也表示不了,边界条件还是很多的
clue

clue      6 小时 25 分钟前

我觉得吧, 一定要把一个复杂的校验用一个正则写出来, 是有强迫症, 也不符合代码高可阅读性的准则

把各个规则拆开校验, 性能又不会有很大的差距, 看起来还简单易懂, 后面的人改起来也方便
Rab

Rab      6 小时 13 分钟前

T4KC8NJ.png
unco020511

unco020511      6 小时 1 分钟前

这种活交给 GPT 就挺好
rainbowhu

rainbowhu      5 小时 55 分钟前   ❤️ 1

(?<!\w)(err(er)?|fail(ed)?)(?!\w)
一般会用来高亮日志里的错误
ShundL

ShundL      5 小时 55 分钟前   ❤️ 2

V2 明令禁止粘贴 AI 回复,我跑这来看你 gpt 生成的回答我为什么不直接问 gpt?
ae86

ae86      5 小时 54 分钟前

https://www.qaq.dad/posts/regex
ShundL

ShundL      5 小时 53 分钟前

存活十年?一会儿就好被封号了。。。
icyalala

icyalala      5 小时 43 分钟前

对于正则这种东西,你觉得 GPT 更可信还是去一个帖子里找到的更可信呢?
zzlit

zzlit      5 小时 16 分钟前

我歪一下,翻页了怎么找呢?
Rickkkkkkk

Rickkkkkkk      5 小时 12 分钟前

正则真的适合人读吗
danhahaha

danhahaha      4 小时 33 分钟前   ❤️ 15

看标题以为你是来请客,进来才发现你只带了口锅
cleanery

cleanery      2 小时 45 分钟前

@danhahaha #29 就是, 与其在这搜, 我为什么不直接问 ai
qiyilai

qiyilai      2 小时 36 分钟前

能随便手写正则的都是怪物,能随便看懂正则的是大怪物
malusama

malusama      2 小时 23 分钟前

正则这种东西即使是自己写的一周后都看不懂
dallaslu

dallaslu      2 小时 19 分钟前

```regexp
^(?=^(?:幺鸡|一筒|幺万|红中|\[二三四五六七八九\]\[条筒万\]){14,17}$)(?=(?:.\*\[鸡条\].\*\[万筒\].\*)|(?:.\*筒.\*\[万条鸡\].\*)|(?:.\*万.\*\[筒条鸡\].\*))(?=.\*\[幺一九中\].\*)(?=^(?:(?:(?(幺鸡|一筒|幺万|红中|\[二三四五六七八九\]\[条筒万\]))\\k{2,3})|(?:幺鸡二条三条|一筒二筒三筒|幺万二万三万|(?:二(?\[条筒万\])三\\k 四\\k)|(?:三(?\[条筒万\])四\\k 五\\k)|(?:四(?\[条筒万\])五\\k 六\\k)|(?:五(?\[条筒万\])六\\k 七\\k)|(?:六(?\[条筒万\])七\\k 八\\k)|(?:七(?\[条筒万\])八\\k 九\\k))|(?:(?(幺鸡|一筒|幺万|红中|\[二三四五六七八九\]\[条筒万\]))\\k))\*(?:(?(幺鸡|一筒|幺万|红中|\[二三四五六七八九\]\[条筒万\]))\\k{2,3})(?:(?:(?(幺鸡|一筒|幺万|红中|\[二三四五六七八九\]\[条筒万\]))\\k{2,3})|(?:幺鸡二条三条|一筒二筒三筒|幺万二万三万|(?:二(?\[条筒万\])三\\k 四\\k)|(?:三(?\[条筒万\])四\\k 五\\k)|(?:四(?\[条筒万\])五\\k 六\\k)|(?:五(?\[条筒万\])六\\k 七\\k)|(?:六(?\[条筒万\])七\\k 八\\k)|(?:七(?\[条筒万\])八\\k 九\\k))|(?:(?(幺鸡|一筒|幺万|红中|\[二三四五六七八九\]\[条筒万\]))\\k))\*$)(?=^(?!(?:.\*(?(幺鸡|一筒|幺万|红中|\[二三四五六七八九\]\[条筒万\]))\\k{3}.\*){4,}).\*$)(?:(?:(?:(?:幺鸡二条三条|一筒二筒三筒|幺万二万三万|(?:二(?\[条筒万\])三\\k 四\\k)|(?:三(?\[条筒万\])四\\k 五\\k)|(?:四(?\[条筒万\])五\\k 六\\k)|(?:五(?\[条筒万\])六\\k 七\\k)|(?:六(?\[条筒万\])七\\k 八\\k)|(?:七(?\[条筒万\])八\\k 九\\k)))|((?(幺鸡|一筒|幺万|红中|\[二三四五六七八九\]\[条筒万\]))\\k{2,3}))\*(?:(?(幺鸡|一筒|幺万|红中|\[二三四五六七八九\]\[条筒万\]))\\k)(?:((?:幺鸡二条三条|一筒二筒三筒|幺万二万三万|(?:二(?\[条筒万\])三\\k 四\\k)|(?:三(?\[条筒万\])四\\k 五\\k)|(?:四(?\[条筒万\])五\\k 六\\k)|(?:五(?\[条筒万\])六\\k 七\\k)|(?:六(?\[条筒万\])七\\k 八\\k)|(?:七(?\[条筒万\])八\\k 九\\k)))|((?(幺鸡|一筒|幺万|红中|\[二三四五六七八九\]\[条筒万\]))\\k{2,3}))\*)$
```

匹配麻将和牌的正则表达式: https://dallas.lu/mahjong-regex/
chrawsl

chrawsl      2 小时 13 分钟前

简单的正则直接手写,复杂的拆成几个特例写几个子匹配,然后套个 (?: ) 和|就行了
areschen

areschen      1 小时 56 分钟前   ❤️ 1

🤣我还以为是有人挖坟贴
aldehyde

aldehyde      1 小时 56 分钟前   ❤️ 1

@dallaslu 日麻有一套比较直观的麻将牌以字符串形式的表达方式。详见 https://tenhou.net/2/
简单来说,麻将牌种类是索子( s )、筒子( p )、万字( m )、字牌( z ),每种各 9 张,编号 1~9 ,日麻规则有红宝牌记为 0 ( 3 红规则每种数牌的各一张 5 ,或者 4 红规则 2 张红 5 筒子)。举例来说,113479m4688p3s24z3s ,24z 分别对应南北,其他的数牌也很一目了然。在这个规则下对字符串进行解析就相对不需要做到那么复杂。
回复这个是因为我在想,对于这个需求,设计的时候就不应该直接把汉字弄到判断和牌的这一步来。这样写多少有些杂耍了。而且这样的一长串正则只能做到一个功能,我如果想要计算最快听牌方式就完全不能复用其中的阶段性的结果。
leonshaw

leonshaw      1 小时 38 分钟前

@oakland 不要用 \d ,用 [0-9]
oakland

oakland      1 小时 5 分钟前

@danhahaha 哈哈哈,有锅也有菜。你是带着碗来的,结果没找到合适的菜?
oakland

oakland      1 小时 4 分钟前

@nagisaushio 如果要把 “1.” 和 “.1” 都囊括进来,感觉只能取其一
oakland

oakland      1 小时 0 分钟前

@clue 认可!能用可读性更高的代码建议用可读性更高的代码,但是这个帖子的目的不是为了强调可读性。
有些场景只能使用正则表达式,这个帖子为了让会的人炫技,为了让不会的人找到可以求助的地方,看的多了就会了
oakland

oakland      58 分钟前

@igeeky
@zapper

抱歉忘记这一条规则了。不过我理解 ai 生成的内容主要针对的是自然语言和一些具有纯解答性质的文字,不是针对这类的讨论
oakland

oakland      57 分钟前

@icyalala 都可信,如果你能读懂的话
oakland

oakland      55 分钟前

@malusama 看的多了就能看懂了
oakland

oakland      8 分钟前

@aldehyde 感谢认真的思考和回复

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK