最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【整理】关于提问者在问别人关于正则表达式方面的问题之前所要明白的事情和前提

RegularExpression crifan 2589浏览 0评论

【背景】

遇到很多人,向别人提问,关于正则表达式方面的问题。

尤其是,希望别人帮其写一个正则表达式,实现匹配,查找,替换等等对应的效果。

但是呢,由于很多,提问者,本身对于正则表达式,不太清楚,所以导致,问题没有说清楚,

导致别人无法准确的回答其问题。

所以,才有此文的出现:

给提问者,解释解释,针对正则表达式,如何提问,别人才能精确的明白你的需求,才能真正的给出你所想要的正则表达式。

 

【解释过程】

1.先说说,关于正则表达式的特殊性

解释正则的特殊性之前,举个例子,你就明白了:

你想要,让别人帮你,找个人;

希望别人帮你找到该人;

然后如果你只说了句:

我要找个男的。

那么结果就是:

别人又不知道,你所要找的人,是哪国人,是中国人还是美国人,还是别国的?

就算猜到,你要找个中国的男的,那如果中国算有13亿人,那也有6亿左右,都符合你这条件。

再说,又不知道,该男的,有啥长相特点,身高多少,年龄多少等等细节?

所以结果就是:

别人,想要帮你找到该人的帮助者,没有得到你的问题的精确描述,根本就没法帮你找到该人,根本没法帮助你。

 

2. 把上述情况,映射到正则表达式中,就是:

举例说明:

以这个为例:

python正则

其问题是:

如何匹配一个文档里头的形式如 hhh:394892m skdjfslsdjf 这样的行,要求:得到394892这个数字

对于回答问题者,得到的信息只是:

如果只是想要从:

hhh:394892m skdjfslsdjf

中提取出,对应的数字的部分:

394892

那么对应的真正表达式,其实很简单,而且也有很多种写法,比如常见的:

(\d+)

就可以了。

但是很明显,此处,要处理的内容:

hhh:394892m skdjfslsdjf

很可能有些其他变化,比如:

aaa:3948m skdjfslsd1234567
hhh123:394892m skdjfslsdjf

对于这样的变化,上述的

(\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.说清楚,输入内容的规律: 越详细,越有助于,别人帮助你写出你所想要,精确的正则表达式;

转载请注明:在路上 » 【整理】关于提问者在问别人关于正则表达式方面的问题之前所要明白的事情和前提

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (1)

  1. 举例子比说更容易让人明白
    ksharpdabu12年前 (2013-04-02)回复
91 queries in 0.203 seconds, using 22.09MB memory