【背景】
遇到很多人,向别人提问,关于正则表达式方面的问题。
尤其是,希望别人帮其写一个正则表达式,实现匹配,查找,替换等等对应的效果。
但是呢,由于很多,提问者,本身对于正则表达式,不太清楚,所以导致,问题没有说清楚,
导致别人无法准确的回答其问题。
所以,才有此文的出现:
给提问者,解释解释,针对正则表达式,如何提问,别人才能精确的明白你的需求,才能真正的给出你所想要的正则表达式。
【解释过程】
1.先说说,关于正则表达式的特殊性
解释正则的特殊性之前,举个例子,你就明白了:
你想要,让别人帮你,找个人;
希望别人帮你找到该人;
然后如果你只说了句:
我要找个男的。
那么结果就是:
别人又不知道,你所要找的人,是哪国人,是中国人还是美国人,还是别国的?
就算猜到,你要找个中国的男的,那如果中国算有13亿人,那也有6亿左右,都符合你这条件。
再说,又不知道,该男的,有啥长相特点,身高多少,年龄多少等等细节?
所以结果就是:
别人,想要帮你找到该人的帮助者,没有得到你的问题的精确描述,根本就没法帮你找到该人,根本没法帮助你。
2. 把上述情况,映射到正则表达式中,就是:
举例说明:
以这个为例:
其问题是:
如何匹配一个文档里头的形式如 hhh:394892m skdjfslsdjf 这样的行,要求:得到394892这个数字 |
对于回答问题者,得到的信息只是:
如果只是想要从:
hhh:394892m skdjfslsdjf
中提取出,对应的数字的部分:
394892
那么对应的真正表达式,其实很简单,而且也有很多种写法,比如常见的:
(\d+)
就可以了。
但是很明显,此处,要处理的内容:
hhh:394892m skdjfslsdjf |
很可能有些其他变化,比如:
aaa:3948m skdjfslsd1234567 |
对于这样的变化,上述的
(\d+)
就无法匹配了,就会得到一些错误的结果。
比如对于
hhh123:394892m skdjfslsdjf
就只能匹配到
123
而不是所希望的
394892
总之,意思是:
对于正则表达式,其比较特殊。
对于同一个固定的要处理内容,写出要匹配某部分的内容,往往就有很多种写法。
再加上很多时候,所要处理的内容,往往有很多种变化,有一些对应的规律等等,
则是需要知道这些规律,才能写出,更加精确的正则表达式,去匹配到你所要处理的内容的。
即,只有完全很清楚你要处理的:
- 输入内容:你要处理的内容
- 如果有一些例子,比如给出你知道的,几种可能的字符串
- 如果有固定的规律,那么最好要,一定要,把对应的变化规律说清楚
- 输出内容:
- 处理后,所要获得的内容是什么
- 一些常见的处理方式,至少包括:
- 提取内容:获取其中的某些内容
- 替换:把某些内容,替换为别的某种值
- 有些时候,可能会涉及,匹配或替换多个部分的值,则更要把具体的处理规则说清楚
如此,别的人,想要帮助你的人,才可以写出精确的,正则表达式,
实现你所需要的,查找,匹配,替换等等的效果。
3. 针对上述的例子,比如,假定我要处理的内容是这样的:
输入内容:
前面是一段字母,然后跟着一个冒号,后面是一段数字,连续的数字,后面有个字母m,接着是空格,然后后面可能是字母或数字
举例:
hhh:394892m skdjfslsdjf
aaa:3948m s12345sdjf
BBB:39482352346357m ss7890f
输出内容:
希望匹配到,m字母之前的,中间那段数字,即对应的输出是:
hhh:394892m skdjfslsdjf -> 394892
aaa:3948m s12345sdjf -> 3948
BBB:39482352346357m ss7890f -> 39482352346357
如此,想要帮助你的人,很清楚你的
要处理的内容的规律了,且从给出的例子中,更好明白了你要处理的内容是什么样的;
知道对应的要输出什么内容了;
如此,就可以写出,对应的正则了:
此处给出,针对上述特定问题,一种常见的写法:
[a-z-A-Z]:(\d+)m .+
其中,上述的(\d+),就可以匹配到你要的对应的数字了。
(注意:即使是很精确的写出,符合你需要的正则表达式,则也都是可以有多种写法的)
针对此正则,还可以简化,或者换成别的各种写法,比如:
[a-z-A-Z]:(\d+).+
[a-z-A-Z]:(\d+)
(\d+).+
(\d+)m .+
(\d+)m.+
等等等等,具体写成什么样,取决于,你所要处理的内容的规律。
而对于上述的,我假设出来的需求,上述的正则,也都是可以实现你要的效果,匹配提取出来对应的数字的部分的。
4. 另外,对于正则表达式的另外一面,多语言,此处只是提醒一下,就不细说了,只简单说说:
正则表达式,只是一种语法。
不同的应用领域,尤其是在不同的计算机语言,各种软件工具等等,有些细微的写法,又不太一样。
比如我目前所接触或听说过的就有:
正则表达式,在
各种计算机语言:Python,C#,PHP,Perl,Ruby,Java等等
一些软件工具:Notepad++,UltraEdit等等;
其他地方:一些GNU工具等等
都有应用。
不同的环境下,有些同样的含义的正则,具体写法,略有区别。
只不过大多数的情况下,尤其是基本的语法,其正则的写法都是一致的。
【总结】
想要别人帮你回答正则表达式的方面的问题,你
最少要:
1.说清楚是什么语言或环境下使用的的,比如是Python还是C#,还是Notepad++中用的,等等;
2.说清楚输入内容的例子,想要的输出是什么样的;
更好的是:
1.说清楚,输入内容的规律: 越详细,越有助于,别人帮助你写出你所想要,精确的正则表达式;