使用正则表达式验证Unicode长度

3

如何使用正则表达式验证۱۳۹۱/۰۹/۰۹字符串?

我希望每个斜杠的长度都是精确的{4}/{2}/{2}

Unicode范围为[\u06F0-\u06F9]

我在长度检查方面遇到了问题。


那不是从右到左写的吗? - Alex Jasmin
你说你“长度检查有问题” - 你尝试过什么,发生了什么事情? - Jon Skeet
@AlexandreJasmin:是的,它是从右到左的。 - user495093
@JonSkeet:我搜索并尝试[\u06F0-\u06F9]{4}?。我发现它匹配精确数字,但如果我的第一组是5,那么正则表达式仍然是正确的。 - user495093
1
@Raika:请发布您使用的完整模式。您可以发布一个简短但完整的程序来演示问题,这应该很容易。 - Jon Skeet
2个回答

5
你可以使用以下正则表达式:
"^[\u06F0-\u06F9]{4}/[\u06F0-\u06F9]{2}/[\u06F0-\u06F9]{2}$"

你可能忘了使用 ^ 让匹配从字符串的开头开始,以及使用 $ 让匹配在字符串的结尾结束。如果没有这些改变,那么包含你的表达式但更长的字符串也会被视为匹配结果。
通过这种改变,只有当字符串包含目标模式并且左右两侧没有额外字符时,匹配才会成功。

1

这个正则表达式应该适用于你:

"(^|[^\u06F0-\u06F9]{1})[\u06F0-\u06F9]{4}/[\u06F0-\u06F9]{2}/[\u06F0-\u06F9]{2}([^\u06F0-\u06F9]{1}|$)"

匹配符合以下两个条件的日期表达式:

  • 条件1:它应该位于字符串的开头或者在不在字符范围[\u06F0-\u06F9]内的单个字符之后

  • 条件2:它应该位于字符串的结尾或者在不在字符范围[\u06F0-\u06F9]内的单个字符之前

这将不会匹配此字符串中的表达式:

How can I validate ۱۱۳۹۱/۰۹/۰۹ string with Regex
-------------------^5Numbers, not matched

或者这个字符串:

How can I validate ۱۱۳۹۱/۰۹/۰۹۹ string with Regex
------------------------------^Three numbers, not matched

但仍将匹配此字符串中的日期表达式:
How can I validate۱۳۹۱/۰۹/۰۹string with Regex  
------------------^---------^ No whitespaces above ^, the expression is matched though

如果你想避免这种情况,即只匹配日期表达式本身,并在其前后加上空格(和换行符),请使用以下正则表达式:

(^|[ \t\n]{1})[\u06F0-\u06F9]{4}/[\u06F0-\u06F9]{2}/[\u06F0-\u06F9]{2}([ \t\n]{1}|$)

希望这对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接