Skip to content
This repository has been archived by the owner on Jan 30, 2022. It is now read-only.

设置页的正则表达式好像有问题 #1

Closed
wangdaye078 opened this issue Jan 3, 2022 · 4 comments
Closed

设置页的正则表达式好像有问题 #1

wangdaye078 opened this issue Jan 3, 2022 · 4 comments

Comments

@wangdaye078
Copy link

wangdaye078 commented Jan 3, 2022

"^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+\$"
似乎应该把最后的斜杠去掉,变成
"^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$"
因为我直接编译出来的,怎么写邮箱都提示格式错误,去掉后就好了。
还有证件的
"^[0-6]*X|^[1-6][0-9]\$"
也应该改成
“^[0-6]X$|^[1-6][0-9]$”或者“^[1-6][0-9X]$”

@arenekosreal
Copy link
Owner

似乎是我的正则表达式没找好,找了一个新的。斜划线是为了转义$字符为原本的意义,正则表达式使用原本的字符来匹配末尾

@wangdaye078
Copy link
Author

你可能不是很熟悉正则表达式,我只熟悉C++并不熟悉JAVA更不熟悉android开发,所以下面只是问题讨论,没有别的意思。而且正则表达式各个实现有一些差别,所以具体通过实验验证
先说^[0-6]*X|^[1-6][0-9]\$
先简化下,变成^[0-6]*X|^[1-6][0-9],为了测试,我去掉了证件只能输入2个字符的限制
这个表达式实际是2部分^[0-6]*X和^[1-6][0-9],满足其中一个,就算满足
我测试通过的有X,44X(匹配前一部分),19(匹配后一部分),测试不通过的有199, 1XX
^匹配行首,19通过,199不通过,表示这个匹配是完整行匹配,不是只匹配开头一段,所以我去掉了^,变成[0-6]*X|[1-6][0-9],测试发现944X不通过。证实了我的猜想,也就是最后加不加$并不影响匹配。
然后是\的作用,正则表达式中\的处理,应该是分2部分,第一步是编译器的处理,第二步是正则表达式的处理,比如\\.
编译器先处理成\.,因为单个的.在正则表达式里有特殊意义,所以正则表达式会把\.转义成字符.,而不是特殊意义的.
然后代码字符串里写\$怎么处理呢,我查了JAVA的转义,发现这个并不是标准的转义,所以编译器应该是直接忽略了斜杠,编译成$,在到达正则表达式之前就丢弃了那个斜杠,如果要让正则表达式接收到\$,那代码里应该写成\\$。
然后我测试了一下,写了个[0-6]*X\$|[1-6][0-9]$这样的正则表达式,然后编译成apk,改名成zip,解压,用十六进制编辑器打开里面的classes.dex,这个是编译后的代码,查找字符串0-6,发现完整的字符串是[0-6]*X$|[1-6][0-9]$,确认了在字符串里写\$和写$是一样的效果。
考虑到身份证首位数字是1-6,末尾是1-9和X,所以只要写成[1-6][0-9X]就好了

@wangdaye078
Copy link
Author

才发现你的“邮箱格式不对”的最前面少了一个叹号,怪不得我填对了就说我格式不对,填错了才能通过

@arenekosreal
Copy link
Owner

奇怪的知识再次增加了,感谢dalao帮忙。惭愧,我的确不熟悉正则表达式,只是随手在网上找了一个现成的,简单测试了一下就拿来用了。我的主力开发也不是 Android 这边,我只是把这个 app 拿来改得更符合我自己的需求一点(

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants