前些天朋友给了我一个非常有意思的问题,他限制一个输入项必须至少包含一个或一个以上的特殊字符,就问题本身并没有什么实用性,不过还是给出了他答案,下面是我的分析思路。
第一步分析需求
基本要求:输入项要求内容必须为大小写字母加特殊字符组成,长度2-15个字符;
特殊要求:输入项中至少包含一个或一个以上的特殊字符。
第二步着手分析
首先满足基本需求很简单,他的输入项内容只能包含大小写字母和特殊字符,那它的表达式由为[a-zaA-z~!@#$%^&*()_+|],限制长度在5-15个字符之间那就是[a-zaA-z~!@#$%^&*()_+|]{2,15},基本需求就已经满足。很简单哈。
接着考虑其特殊要求,输入项中至少包含一个或一个以上的特殊字符,现在我们可以肯定的是其输入特殊字符串的位置不能确定,在这里我们就得要考虑正则式的正反向预编译来处理了。
下面是一些基本概念,具体的需要大家去查询资料了。
正向预搜索:"(?=xxxxx)","(?!xxxxx)"
格式:"(?=xxxxx)",在被匹配的字符串中,它对所处的 "缝隙" 或者 "两头" 附加的条件是:所在缝隙的右侧,必须能够匹配上 xxxxx 这部分的表达式。因为它只是在此作为这个缝隙上附加的条件,所以它并不影响后边的表达式去真正匹配这个缝隙之后的字符。这就类似 "\b",本身不匹配任何字符。"\b" 只是将所在缝隙之前、之后的字符取来进行了一下判断,不会影响后边的表达式来真正的匹配。
反向预搜索:"(?<=xxxxx)","(?<!xxxxx)"
这两种格式的概念和正向预搜索是类似的,反向预搜索要求的条件是:所在缝隙的 "左侧",两种格式分别要求必须能够匹配和必须不能够匹配指定表达式,而不是去判断右侧。与 "正向预搜索" 一样的是:它们都是对所在缝隙的一种附加条件,本身都不匹配任何字符。
根据需求,我们很明确的看到这一个标准的正向预搜索,但反过来一看不就是不匹配全是字符是字符串。
所以层层具体下来,我们先容易得出想要的答案
(?![a-zA-Z]+$)//不匹配只有a-zA-Z_的串,意思则为特殊字符的个数必须大于等于1
一起组合起来我们就得到我们完整的答案:^(?![a-zA-Z]+$)[a-zA-z~!@#$%^&*()_+|]{2,15}$
近日在水源又看到有朋友在问关于限制用户名的正则表达式
整理了一下,共三个要求:
1.大于6位
2.字母+数字
3.最少二个字母
其实这个问题我记得早在很久以久CSDN上的过客兄就对这个问题做了非常详细的介绍和解答,不过好像大家没有吸引到
在这里借花献佛再次给大家分析一下^_^
我写正则一般是先满足整体,再求局部修正,标准的自顶向下解决模式
只要大家对正则有些了解的朋友都知道,前两个需求实在太简单了
我们先把其写出来,应该说这大框架就已经实现
即
^[a-zA-Z0-9]{6,}$
接着进行局部的修正,满足所有的要求,最少二个字母,然而位置不确定,这必定需要用到我们的正反向预搜索
在过客兄的贴子中他使用的是反向预搜索,当然我们现在也可以考虑用他的方法,懒的想嘛^o^.
按照它的思路分析就是我们必须不能匹配输入项上字母个数为0个或是1个的.
不过这样写貌似表达会产生一些问题,总之就是似乎不太好用.其实这个方案完全没有必要使用反向预搜索机制
简单的正向匹配就可以了,想想我们直接去匹配字母个数大于等于2个以后的匹配,那样是不是更简单呢.^o^.
看来还是不能偷懒,以下是正向预搜索机制解答的全部答案
^(?=(?:.*?[a-zA-Z]){2,})[a-zA-Z0-9]{6,}$
是不是比反向的更简单更容易理解呢.不过前面也留到一个问题..就是反身预搜索的时候不太好用...
这个原因,得好好研究一下^0^.
转自:http://www.cnblogs.com/symbol441/archive/2007/09/24/903990.html
分享到:
相关推荐
编译原理课的大作业 包含三个小实验 在一个cpp文件里 正则表达式转换为nfa nfa转换为dfa dfa最小化 个人原创代码
正则式(Regular Expression,简称regex)是一种模式匹配语言,用于在文本中查找、替换或提取符合特定规则的字符串。在软件开发过程中,正则表达式是不可或缺的一部分,尤其是在处理数据验证、搜索和数据提取等任务...
其中,正则式、非确定性有限自动机(NFA)和确定性有限自动机(DFA)是编译原理中关于文本模式匹配的重要概念,它们在解析器设计、词法分析和正则表达式引擎中发挥着关键作用。 首先,我们来了解正则式。正则式,也...
通过这样的实验,我们可以深入理解正则表达式与有限状态自动机之间的关系,掌握如何将正则表达式转换为DFA,并实际应用到编译器的设计中,这对于理解编译原理,特别是词法分析阶段是非常有帮助的。同时,这也是...
正则式,全称为“正则表达式”,是编程领域中一种强大的文本处理工具,用于匹配、查找、替换和分析字符串。它通过一系列特定的字符和语法构建模式,可以高效地处理各种复杂的文本匹配任务。在软件开发、数据处理、...
`re.compile()`是Python标准库`re`模块中的一员,它允许我们将正则表达式模式编译为可重用的对象,从而提高执行效率。 ### 正则表达式基础 正则表达式(Regular Expression)是一种特殊的字符串序列,用于描述一种...
Jakarta-ORO库中的`Perl5Compiler`类用于编译正则表达式,而`Perl5Matcher`类用于执行匹配操作。 **示例代码**: ```java import org.apache.regexp.*; public class SocialSecurityNumber { public static void ...
这是编译原理的一个实验, 是把一个正则表达式转化为不确定有穷自动机NFA的算法程序,朋兴趣的朋友可以下载来看看哦. 一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式...
这篇课程设计报告主要探讨了如何将正则式转换为有限自动机,特别是在编译原理的背景下。正则式是描述字符集的一种数学表达方式,广泛应用于文本处理、模式匹配等领域。而有限自动机(Finite Automaton)是一种计算...
这个压缩包提供的是预编译好的PCRE库,适用于VC6用户,无需自行编译,直接可以用于项目开发。 正则表达式是一种模式匹配工具,能够用于文本搜索、替换等操作,其语法复杂但功能强大。PCRE库实现了Perl语言风格的...
本篇文章将深入探讨正则式与NFA、DFA之间的转换以及DFA的最小化过程。 首先,正则表达式是一种简洁的语法,用于表示一类字符串的集合,如"a*"代表零个或多个"a"字符的序列。它们通过操作符如"+"、"*"、"|"和"()...
在实际编程中,Java提供了`java.util.regex`包来处理正则表达式,包括`Pattern`类用于编译正则表达式模式,`Matcher`类用于执行匹配操作。这些工具可以帮助开发者在Java程序中方便地进行文本查找、替换和分割等操作...
正则式生成器是一款工具软件,旨在帮助用户创建和编辑正则表达式,适用于那些对正则表达式不熟悉或需要快速构建复杂匹配模式的人员。正则表达式(Regular Expression,简称regex)是一种强大的文本处理工具,广泛...
正则式,或称为正则表达式,是用于在文本中进行模式匹配和搜索的强大工具。在编程语言中,如JavaScript,正则式被广泛应用于字符串处理,包括验证输入、提取信息、替换文本等场景。以下是对正则式及其在JavaScript中...
正则表达式工具,如提供的"正则表示式工具.exe",是专门用来测试和调试正则表达式的软件。这类工具通常有以下特点: 1. **实时匹配**:输入正则表达式和测试字符串,立即显示匹配结果。 2. **高亮显示**:高亮匹配...
但编写复杂的正则表达式可能会变得困难,这时可以借助如Expresso或RegexBuddy这样的工具,它们提供图形界面来构建、测试和调试正则表达式,帮助开发者更好地理解和使用正则。 在压缩包中,"Setup.Exe"通常是一个...
对bin文件查找出指定格式字符,采用正则式表达
大学课程中编译原理课程的正则表达式章节中关于正则表达式的理解和应用,使用Java GUI进行编写,主要包括了各种主要的正则匹配和正则使用
"正则达式测器"是一款实用工具,帮助用户在编写正则表达式时实时检查其正确性和有效性。 正则表达式的核心概念包括: 1. **字符类**:例如 `[abc]` 表示匹配 a、b 或 c 中的一个字符。`[^abc]` 表示匹配除了 a、b ...