精华内容
下载资源
问答
  • 正则表达式(regular expression abbr. regex) 功能强大,能够用于在一大串字符里找到所需信息。它利用约定俗成的字符结构表达式来发生作用。不幸的是,简单的正则表达式对于一些高级运用,功能远远不够。若要进行...

    正则表达式(regular expression abbr. regex) 功能强大,能够用于在一大串字符里找到所需信息。它利用约定俗成的字符结构表达式来发生作用。不幸的是,简单的正则表达式对于一些高级运用,功能远远不够。若要进行筛选的结构比较复杂,你可能就需要用到高级正则表达式。

    本文介绍正则表达式的高级技巧。筛选出了八个常用的概念,并配上实例解析,每个例子都是满足某种复杂要求的简单写法。如果你对正则的基本概念尚缺乏了解,请先阅读这篇文章,或者这个教程,或者维基条目。

    这里的正则语法适用于php,与perl兼容。

    1. 贪婪/懒惰

    所有能多次限定的正则运算符都是贪婪的。他们尽可能多地匹配目标字符串,也就是说匹配结果会尽可能地长。不幸的是,这种做法并不总是我们想要的。因此,我们添加“懒惰”限定符来解决问题。在各个贪婪运算符后添加“?”能让表达式只匹配尽可能短的长度。另外,修改器“u”也能惰化能多次限定的运算符。理解贪婪与懒惰的区别是运用高级正则表达式的基础。

    贪婪操作符

    操作符 匹配之前的表达式零次或零次以上。它是一个贪婪操作符。请看下面的例子:

    preg_match( ' /< h1> .< /h1> /' ' < h1> 这是一个标题。< /h1>

    < h1> 这是另一个。< /h1> ' $matches )

    句点(.)能代表除换行符外的任意字符。上面的正则表达式匹配 h1 标签以及标签内的所有内容。它用句点(.)和星号()来匹配标签内的所有内容。匹配结果如下:

    1.< h1> 这是一个标题。< /h1> < h1> 这是另一个。< /h1>

    整个字串都被返回。 操作符会连续匹配所有内容—— 甚至包括中间的 h1 闭合标签。因为它是贪婪的,匹配整个字串是符合其利益最大化原则。

    懒惰操作符

    把上面的式子稍作修改,加上一个问号(?),能让表达式变懒惰:

    1./< h1> .?< /h1> /

    这样它会觉得,只需匹配到第一个 h1 结尾标签就完成任务了。

    另一个有着类似属性的贪婪操作符是 {n } 。它代表之前的匹配模式重复n次或n次以上,如果没有加上问号,它会寻找尽可能多的重复次数,加上的话,则会尽可能少重复(当然也就是“重复n次”最少)。

    # 建立字串

    $str = ' hihihi oops hi'

    # 使用贪婪的{n }操作符进行匹配

    preg_match( ' /(hi){2 }/' $str $matches ) # matches[0] 将是 ' hihihi'

    # 使用堕化了的 {n }? 操作符匹配

    preg_match( ' /(hi){2 }?/' $str $matches ) # matches[0] 将是 ' hihi'

    2. 回返引用(back referencing)

    有什么用?

    回返引用(back referencing)一般被翻译成“反向引用”、“后向引用”、“向后引用”,个人觉得“回返引用”更为贴切[笨活儿]。它是在正则表达式内部引用之前捕获到的内容的方法。例如,下面这个简单例子的目的是匹配出引号内部的内容:

    # 建立匹配数组

    $matches = array()

    # 建立字串

    $str = " " this is a ' string' " "

    # 用正则表达式捕捉内容

    preg_match( " /(" |' ).?(" |' )/" $str $matches )

    # 输出整个匹配字串

    echo $matches[0]

    它会输出:

    1." this is a'

    显然,这并不是我们想要的内容。

    这个表达式从开头的双引号开始匹配,遭遇单引号之后就错误地结束了匹配。这是因为表达式里说:(”|'),也就是双引号(”)和单引号(')均可。要修正这个问题,你可以用到回返引用。表达式1 2 … 9 是对前面已捕获到的各个子内容的编组序号,能作为对这些编组的“指针”而被引用。在此例中,第一个被匹配的引号就由 1 代表。

    如何运用?将上面的例子中,后面的闭合引号替换为1:

    1.preg_match( ' /(" |' ).?1/' $str $matches )

    这会正确地返回字串:

    1." this is a ' string' "

    译注思考题:

    如果是中文引号,前引号和后引号不是同一个字符,怎么办?

    还记得php函数 preg_replace 吗?其中也有回返引用。只不过我们没有用 1 … 9,而是用了 $1 … $9 … $n (此处任意数目均可)作为回返指针。例如,如果你想把所有的段落标签< p> 都替换成文本:

    $text = preg_replace( ' /< p> (.?)< /p> /'

    " & lt p& gt $1& lt /p& gt " $html )

    参数$1是一个回调引用,代表段落标签< p> 内部的文字,并插入到替换后的文本里。这种简便易用的表达式写法为我们提供了一个获取已匹配文字的简单方法,甚至在替换文本时也能使用。

    3. 已命名捕获组(named groups)

    当在一个表达式内多次用到回调引用时,很容易就把事情搞混淆,要弄清那些数字(1 … 9)都代表哪一个子内容是件很麻烦的事。回调引用的一个替代方法是使用带名字的捕获组(下文简称“有名组”)。有名组使用(?p< name> pattern)来设定,name代表组名,pattern是配合该有名组的正则结构。请看下面的例子:

    1./(?p< quote> " |' ).?(?p=quote)/

    上式中,quote就是组名,”|' 的是匹配内容的正则。后面的(?p=quote)是在调用组名为quote的有名组。这个式子的效果和上面的回调引用实例一样,只不过是用了有名组来实现。是不是更加易读易懂了?

    有名组也能用于处理已匹配内容之数组的内部数据。赋予特定正则的组名也能作为所匹配到的内容在数组内部的索引词。

    preg_match( ' /(?p< quote> " |' )/' " ' string' " $matches )

    # 下面的语句输出“' ”(不包括双引号)

    echo $matches[1]

    # 使用组名调用,也会输出“' ”

    echo $matches[' quote' ]

    所以,有名组并不只是让写代码更容易,它也能用于组织代码。

    4. 字词边界(word boundaries)字词边界是字串里的字词字符(包括字母、数字和下划线,自然也包括汉字)和非字词字符之间的位置。其特殊之处就在于,它并不匹配某个实在的字符。它的长度是零。 b 匹配所有字词边界。

    不幸的是,字词边界一般都被忽视掉了,大部分人都没有在意他的现实意义。 例如,如果你想要匹配单词“import”:

    1./import/

    注意了!正则表达式有时候很调皮的。下面的字串也能和上面的式子匹配成功:

    1.important

    你或许觉得,只要在import前后加上空格,不就可以匹配这个独立的单词了:

    1./ import /

    那如果遇上这种情况呢:

    1.the trader voted for the import

    当 import 这个词在字串开头或者结尾时,修改后的表达式仍然不能用。因此,考虑各种情况是必须的:

    1./(^import | import | import$)/i

    别慌,还没完呢。如果遇到标点符号了呢?就为了满足这一个单词的匹配,你的正则可能就需要这样写:

    1./(^import(:| | )? | import(:| | )? | import(.|?|!)?$)/i

    对于只匹配一个单词来说,这样做实在是有点大动干戈了。正因如此,字词边界才显得意义重大。要适应上述要求,以及很多其他情况变种,有了字符边界,我们所需写的代码只是:

    1./bimportb/

    上面所有情况都得到了解决。 b 的灵活性就在于,它是一个没有长度的匹配。它只匹配两个实际字符之间想象出的位置。它检查两个相邻字符是否是一个为单字,另一个为非单字。情况符合,就返回匹配。如果遇到了单词的开头或结尾, b 会把它当成是非单词字符对待。由于import里面的 i 仍然被看成是单词字符,import 就被匹配出来了。

    注意,与b相对,我们还有 b,此操作符匹配两个单字或者两个非单字之间的位置。因此,如果你想匹配在某个单词内部的‘hi',可以使用:

    1.bhib

    “this”、“hight”,都会返回匹配,而“hi there”则会返回不匹配。

    5. 最小组团(atomic groups)

    最小组团是无捕捉的特殊正则表达式分组。通常用来提高正则表达式的效能,也能用于消除特定匹配。一个最小组团可以用(?> pattern) 来定义,其中pattern是匹配式。

    1./(?> his|this)/

    当正则引擎针对最小组团进行匹配时,它会跳过组团内标记的回溯位置。以单词“smashing”为例,当用上面的正则表达式匹配时,正则引擎会先尝 试在“smashing”里寻找“his”。显然,找不到任何匹配。此时,最小组团就发挥作用了:正则引擎会放弃所有回溯位置。也就是说,它不会尝试再从 “smashing”里查找“this”。为什么要这样设置?因为“his”都没有返回匹配结果,包含有“his”的“this”当然就更匹配不了了!

    上面的例子并没有什么实用性,我们用/t?his?/ 也能达到效果。再看看下面的例子:

    1./b(engineer|engrave|end)b/

    如果把“engineering”拿去匹配,正则引擎会先匹配到“engineer”,但接下来就遇到了字词边界,b,所以匹配不成功。然后,正则 引擎又会尝试在字串里寻找下一个匹配内容:engrave。匹配到eng的时候,后面的又对不上了,匹配失败。最后,尝试“end”,结果同样是失败。仔 细观察,你会发现,一旦engineer匹配失败,并且都抵达了字词边界,“engrave”和“end”这两个词就已经不可能匹配成功了。这两个词都比 engineer短小,正则引擎不应该再多做无谓的尝试。

    1./b(?> engineer|engrave|end)b/

    上面的替代写法更能节省正则引擎的匹配时间,提高代码的工作效率。

    6. 递归(recursion)递归(recursion)用于匹配嵌套结构,例如括弧嵌套, (this (that)),html标签嵌套< div> < div> < /div> < /div> 。我们使用(?r)来代表递归过程中的子模式。下面是一个匹配嵌套括弧的例子:

    1./(((?> [^()]+)|(?r)))/

    最外层使用了反义符的括号“(”匹配嵌套结构的开端。然后是一个多选项操作符( | ),可能匹配除括号外的所有字符 “(?> [^()]+)”,也可能是通过子模式“(?r)”来再次匹配整个表达式。请注意,这个操作符会尽量多地匹配所有嵌套。

    递归的另一个实例如下:1./< ([w]+).?> ((?> [^< > ]+)|((?r)))< /1> /

    以上表达式综合运用了字符分组,贪婪操作符、回溯,以及最小化组团来匹配嵌套标签。第一个括弧内分组([w]+)匹配出标签名,用于接下来的应用。若找到这尖括号样式的标签,则尝试寻找标签内容的剩余部分。下一个括弧括起来的子表达式和上一个实例非常相似:要么匹配不包括尖括号的所有字符 (?> [^< > ]+),要么递归匹配整个表达式(?r)。整个表达式最后一部分就是尖括号样式的闭合标签< /1> 。

    7. 回调(callbacks)匹配结果中的特定内容有时可能会需要某种特别的修改。要应用多重而复杂的修改,正则表达式的回调就有了用武之地。回调是用于函数preg_replace_callback中的动态修改字串的方式。你可以为preg_replace_callback指定某个函数为参数,此函数能接收匹配结果数组为参数,并将数组修改后返回,作为替换的结果。

    例如,我们想将某字串中的字母全部转变成大写。十分不巧,php没有直接转化字母大小写的正则操作符。要完成这项任务,就可以用到正则回调。首先,表达式要匹配出所有需要被大写的字母:

    1./bw/

    上式同时使用了字词边界和字符类。光有这个式子还不够,我们还需要一个回调函数:

    function upper_case( $matches ) {

    return strtoupper( $matches[0] )

    }

    函数upper_case接收匹配结果数组,并将整个匹配结果转化成大写。 在此例中,$matches[0]代表需要被大写化的字母。然后,我们再利用preg_replace_callback实现回调:

    1.preg_replace_callback( ' /bw/' " upper_case" $str )

    一个简单的回调即有这般强大的力量。

    8. 注释(commenting)

    注释不用来匹配字串,但确实是正则表达式中最重要的部分。当正则越写越深入,越写越复杂,要推译出究竟什么东西被匹配就会变得越来越困难。在正则表达式中间加上注释,是最小化将来的迷糊和困惑的最佳方式。

    要在正则表达式内部加上注释,使用(?#comment)格式。把“comment”替换成你的注释语句:

    1./(?#数字)d/

    如果你打算把代码公之于众,为正则表达式加上注释就显得尤为重要。这样别人才能更容易看懂和修改你的代码。和其他场合的注释一样,这样做也能为你重访自己以前写的程序时提供方便。

    考虑使用“x”或“(?x)”修改器来格式化注释。这个修改器让正则引擎忽略表达式参数之间的空格。“有用的”空格仍然能够通过[ ]或(反义符加空格)来匹配。

    /

    d #digit

    [ ] #space

    w+ #word

    /x

    上面的代码与下面的式子作用一样:

    1./d(?#digit)[ ](?#space)w+(?#word)/

    请时刻注意代码的可读性。

    模式修正符

    是为正则表达式增强和补充的一个功能,使用在正则之外

    例子:/正则/U U就表示一个模式修正符

    一下几个为php中常用的:(注意:区分大小写)

    i 正则内容在匹配时候不区分大小写(默认是区分的)

    m 在匹配首内容或者尾内容时候采用多行识别匹配

    s 将转义回车取消是为单位匹配

    x 忽略正则中的空白

    A 强制从头开始匹配

    D 强制$匹配尾部任何内容\n

    U 禁止贪mei匹配,只跟踪到最近的一个匹配符并结束,常用在采集程序的正则表达式

    展开全文
  • 正则表达式替换文字 表达式If you’re just starting out with regular expressions (regex), the syntax can seem a bit puzzling at first (I would recommend Jason Pasnikowski’s article as a good starting ...

    正则表达式替换文字 表达式

    If you’re just starting out with regular expressions (regex), the syntax can seem a bit puzzling at first (I would recommend Jason Pasnikowski’s article as a good starting point). One of the things that make it difficult to grasp regex in the beginning is the small number of times you have a chance to use them in your code, which in turn limits the amount of practice you have using them. Professionals in any capacity, be it sports, entertainment, or development always practice – some practice more than others.

    如果您只是从正则表达式(regex)开始,那么语法起初似乎有些令人费解(我建议Jason Pasnikowski的文章作为一个很好的起点)。 一开始让正则表达式难以理解的一件事是您有机会在代码中使用正则表达式的次数很少,这反过来又限制了您使用正则表达式的次数。 无论是运动,娱乐还是发展,任何能力的专业人员都经常练习-有些练习比其他练习更多。

    So how can you practice using regex if you are limited to just using them in your code? The answer is to use a utility, of which there are many, that uses regex for performing search and replace. I’m sure everyone is familiar with the standard “find x and replace it with y” type of search and replace. Most IDEs and text editors have built in regex engines to handle search and replace. In this article I’d like to walk through a series of exercises to help you practice using regex.

    因此,如果您仅限于在代码中使用正则表达式,该如何练习使用正则表达式? 答案是使用一个实用程序,其中有很多使用regex执行搜索和替换。 我确信每个人都熟悉标准的“查找x并将其替换为y ”类型的搜索和替换。 大多数IDE和文本编辑器都内置了正则表达式引擎来处理搜索和替换。 在本文中,我想通过一系列练习来帮助您练习使用正则表达式。

    I’ll be using NetBeans for this article. Some editors might have slightly different regex behavior that what you see here, so if you’re using something other than NetBeans and it doesn’t work quite as you’d expect, be sure to read the documentation for your specific editor.

    我将在本文中使用NetBeans。 一些编辑器的正则表达式行为可能与您在此处看到的略有不同,因此,如果您使用的不是NetBeans,则不能正常使用,请确保阅读特定编辑器的文档。

    词边界 (Word Boundaries)

    Let’s use the following code to start with for our examples; I’ve crafted it specifically to illustrate particular caveats of search and replace as your progress.

    让我们使用以下代码作为示例。 我特意制作了它,以说明搜索的特定注意事项并随您的进度进行替换。

    <div id="navigation">
     <a href="divebomb.php" title="All About Divebombs">Divebombs</a>&nbsp;&nbsp;|&nbsp;&nbsp;
     <a href="endives.php" title="All About Endives">Endives</a>&nbsp;&nbsp;|&nbsp;&nbsp;
     <a href="indivisible.php" title="Indivisible by Zero">Indivisible Numbers</a>&nbsp;&nbsp;|&nbsp;&nbsp;
     <a href="division.php" title="All About Division">Divison</a>&nbsp;&nbsp;|&nbsp;&nbsp;
     <a href="skydiving.php" title="All About Skydiving">Skydiving</a>&nbsp;&nbsp;|&nbsp;&nbsp;
    </div>

    This navigation code should ideally be an unordered list, not free anchors inside div tags. You can’t just replace the word “div” with “ul” however because divebomb would become ulebomb, endives would become enules, etc. You also can’t use “<div” because it would miss the closing div tag. You can manually replace the div tags with ul tags, or you can use the special sequence b which denotes a word boundary.

    理想情况下,此导航代码应该是无序列表,而不是div标签中的自由锚。 但是,您不能仅用“ ul”替换“ div”一词,因为Divedbomb会变成ulebomb,菊苣会变成enule,等等。您也不能使用“ <div”,因为它会错过结束div标签。 您可以使用ul标签手动替换div标签,也可以使用表示单词边界的特殊序列b

    In the Search field, type: bdivbIn the Replace field, type: ul

    在“搜索”字段中,键入: bdivb在“替换”字段中,键入: ul

    This only replaces the text “div” that was delimited by word boundaries. Word boundaries allow you to perform whole word only searches, so the word “div” in <div id=”navigation”> and </div> both get matched while the substrings in the anchors are left alone.

    这仅替换了由单词边界分隔的文本“ div”。 单词边界允许您执行全单词搜索,因此<div id =“ navigation”>和</ div>中的单词“ div”都将匹配,而锚点中的子字符串则保持不变。

    Later you’ll also see w, which is used to match non-whitespace “word” characters.

    稍后您还将看到w ,它用于匹配非空白的“单词”字符。

    分组和反向引用 (Groupings and Back References)

    Continuing with the modified code from the first example, let’s continue refactoring the list. Right now your code should look like this:

    继续第一个示例中的修改后的代码,让我们继续重构列表。 现在,您的代码应如下所示:

    <ul id="navigation">
     <a href="divebomb.php" title="All About Divebombs">Divebombs</a>&nbsp;&nbsp;|&nbsp;&nbsp;
     <a href="endives.php" title="All About Endives">Endives</a>&nbsp;&nbsp;|&nbsp;&nbsp;
     <a href="indivisible.php" title="Indivisible by Zero">Indivisible Numbers</a>&nbsp;&nbsp;|&nbsp;&nbsp;
     <a href="division.php" title="All About Division">Divison</a>&nbsp;&nbsp;|&nbsp;&nbsp;
     <a href="skydiving.php" title="All About Skydiving">Skydiving</a>&nbsp;&nbsp;|&nbsp;&nbsp;
    </ul>

    You can easily do a standard search and replace on the anchor tags without any of the issues that prevented you from doing so with div, but where is the fun in that? In the spirit of practice, let’s use regex to wrap the anchors in li tags.

    您可以轻松地进行标准搜索并替换锚标记,而不会遇到任何妨碍div的问题,但是这样做的乐趣何在? 本着实践的精神,让我们使用正则表达式将锚点包装在li标签中。

    To select the anchors, type the following in the Search field: (<a.*>)In the Replace field, type: <li>$1</li>

    若要选择锚点,请在“搜索”字段中键入以下内容: (<a.*>)在“替换”字段中,键入: <li>$1</li>

    Ignoring the parentheses in the search pattern for now, let’s break up the pattern and discuss each piece of it. The first piece is <a, which tells the regex engine to match a less-than symbol followed by the letter a. The next part of this piece is .*>, which tells the engine to match any character zero or more times followed by a greater-than symbol. This piece matches the anchor tags in the block of code above.

    现在暂时忽略搜索模式中的括号,让我们分解一下模式并讨论它的每一部分。 第一个是<a,它告诉正则表达式引擎匹配一个小于号,后跟字母a 。 这部分的下一部分是。*>,它告诉引擎将任何字符匹配零次或多次,后跟一个大于号。 这部分与上面代码块中的anchor标签匹配。

    The parentheses in the search pattern perform a special function; they group the individual matches which you can access later. By adding the parentheses, you are telling the regex engine to store the matching result because you’ll need them later. You can access these groups by number.

    搜索模式中的括号执行特殊功能; 他们将各个匹配项分组,您以后可以访问。 通过添加括号,您是在告诉正则表达式引擎存储匹配结果,因为稍后将需要它们。 您可以按编号访问这些组。

    The replace pattern tells the engine to replace the search pattern with an opening li tag, followed by the contents in the first grouping, and a closing li tag. In this example there is only one group (because there is only one set of parenthesis), so the $1 in the middle of the li tags indicates this is the group you want to use. (Some editors may use 1 instead of $1. If $1 does work, then undo your replacement and try the other variant.)

    替换模式告诉引擎用开头的li标签,后跟第一个分组中的内容和结尾的li标签替换搜索模式。 在此示例中,只有一个组(因为只有一组括号),因此li标记中间的$1表示这是您要使用的组。 (某些编辑器可能会使用1而不是$1如果$1起作用,请撤消替换,然后尝试其他变体。)

    You can have multiple groups, and groups can be nested which you’ll see in just a moment. You’re going to modify the patterns you just used to add the li tags in order to create a more robust navigation. Undo the replacements you’ve just made. Usually something like Ctrl+Z works just fine, but if it doesn’t here’s the search and replace patterns to revert the code:

    您可以有多个组,并且可以嵌套组,稍后您将看到它们。 您将修改刚刚用于添加li标签的模式,以创建更强大的导航。 撤消刚刚完成的替换。 通常,像Ctrl + Z类的东西就可以正常工作,但是如果不行,这里是搜索和替换模式以还原代码:

    In the Search field, type: <li>(<a.*>)</li>In the Replace field, type: $1

    在“搜索”字段中,键入: <li>(<a.*>)</li>在“替换”字段中,键入: $1

    多个分组 (Multiple Groupings)

    Alright, now let’s wrap the anchor tags in li tags complete with class and id attributes for use with CSS. To accomplish this, you’ll use the following:

    好了,现在让我们将锚标签包装在带有classid属性的li标签中,以供CSS使用。 为此,您将使用以下内容:

    Search: (<a.*>(w+).*</a>)Replace: <li class="navEntry" id="$2">$1</li>

    搜索: (<a.*>(w+).*</a>)替换: <li class="navEntry" id="$2">$1</li>

    As in the second example’s search pattern, <a.*> matches the anchor tags. You’re asking the regex engine to find a string that begins with a greater-than symbol, followed by the letter a, followed by series of zero or more characters that ends with a less-than symbol. With w+ you are also asking the engine to look for a sequence of characters that doesn’t contain any whitespace or symbol characters and has a length greater than zero. The parentheses around w+ indicate you want to store the match as a group. Next you added .* to the pattern to match any other characters that may appear before the closing of the anchor tag. The result is that $1 will have the matched anchor string, and $2 will have the first word of the link’s text.

    与第二个示例的搜索模式一样,<a。*>匹配锚标记。 您要让正则表达式引擎查找以大于号开头的字符串,然后是字母a ,然后是一系列零个或多个以小于号结尾的字符。 使用w+您还要求引擎寻找不包含任何空格或符号字符且长度大于零的字符序列。 w+周围的括号表示您要将匹配存储为一个组。 接下来,您将。*添加到模式中,以匹配锚标记关闭之前可能出现的任何其他字符。 结果是$1将具有匹配的定位字符串,而$2将具有链接文本的第一个单词。

    Breaking down the replacement, you begin with li, a class attribute and its value, followed by the id attribute. Instead of providing an id value however you have $2. This tells the regex engine you want to use the content stored in the second group from the search pattern, which in this case is the w+. Then you open the li tag, tell the regex engine you want to use the first grouping ($1 is the entire anchor tag), and finally close the li tag.

    要分解替换项,请从liclass属性及其值开始,然后是id属性。 除了提供id值之外,您还有$2 。 这告诉正则表达式引擎您要使用搜索模式中第二组中存储的内容,本例中为w+ 。 然后,您打开li标签,告诉正则表达式引擎您要使用第一个分组( $1是整个锚标签),最后关闭li标签。

    Be careful when you are determining which groups to replace. Consider the following hypothetical example (I’ve used group names instead of patterns to illustrate how grouping works):

    确定要替换的组时请小心。 考虑下面的假设示例(我使用组名而不是模式来说明分组的工作方式):

    (group1(group2))(group3)
    

    Using the above gives you the following results:

    使用上面的方法可以为您提供以下结果:

    $1 = group1group2
    $2 = group2
    $3 = group3
    

    $1 contains both group1 and group2 because parentheses enclose both of them. This is true even though group2 is a group by itself. And then of course group3 is a group to itself.

    $1包含group1group2,因为括号将它们都包围了。 即使group2本身是一个组,也是如此。 当然, group3本身就是一个组。

    To finish cleaning things up, you can remove the non-breaking space entities and the pipe character from the end of the lines and replace them with an empty string (the pipe needs to be preceded by a backslash in the expression because it has special meaning to the engine).

    要清理完所有内容,您可以从行尾删除不间断的空格实体和管道字符,然后将它们替换为空字符串(管道在表达式中必须以反斜杠开头,因为它具有特殊含义引擎)。

    Search: &nbsp;&nbsp;|&nbsp;&nbsp;Leave the Replace field empty.

    搜索: &nbsp;&nbsp;|&nbsp;&nbsp; 将“替换”字段留空。

    You’re code should now look like this – a nice, neat, well-structured list you can use CSS with to style:

    您的代码现在应该看起来像这样–一个漂亮,整洁,结构良好的列表,可以使用CSS进行样式设置:

    <ul id="navigation">
     <li class="navEntry" id="Divebombs"><a href="divebomb.php" title="All About Divebombs">Divebombs</a></li>
     <li class="navEntry" id="Endives"><a href="endives.php" title="All About Endives">Endives</a></li>
     <li class="navEntry" id="Indivisible"><a href="indivisible.php" title="Indivisible by Zero">Indivisible Numbers</a></li>
     <li class="navEntry" id="Divison"><a href="division.php" title="All About Division">Divison</a></li>
     <li class="navEntry" id="Skydiving"><a href="skydiving.php" title="All About Skydiving">Skydiving</a></li>
    </ul>

    摘要 (Summary)

    Thanks for taking some time to learn a little bit more about regular expressions and practicing with them using search and replace. I encourage anyone who is struggling to grasp the concepts to practice using search and replace in their editor because it’s convenient and generally provides immediate visual feedback. If necessary, you can copy and paste the content you’re working with into a blank file and experiment with it, running replacements and undoing them, until you get what you like.

    感谢您抽出一些时间来学习有关正则表达式的更多信息,并使用搜索和替换对其进行练习。 我鼓励任何努力掌握概念的人在其编辑器中使用搜索和替换来实践,因为它很方便并且通常会立即提供视觉反馈。 如有必要,您可以将正在使用的内容复制并粘贴到空白文件中并进行实验,运行替换并撤消替换,直到获得所需的内容。

    翻译自: https://www.sitepoint.com/practicing-regular-expressions/

    正则表达式替换文字 表达式

    展开全文
  • 对于最一般的查找与替换功能相信各位都熟悉了,但是借助于WORD所支持的正则表达式,我们可以实现更复杂和实用的数据格式更改。我搜索了一些文章都提供了有关使用正则表达式的不同程度的例子,但是直接套用有许多是...

    在实际开发中经常使用对WORD/EXCEL及其他数据格式的整理,其中之一便是使用WORD中的查找与替换功能整理数据。

    对于最一般的查找与替换功能相信各位都熟悉了,但是借助于WORD所支持的正则表达式,我们可以实现更复杂和实用的数据格式更改。

    我搜索了一些文章都提供了有关使用正则表达式的不同程度的例子,但是直接套用有许多是不行的。因此,我想在本文中好好整理一下,但是

    时间原因,一下没法整理完,只好一部分一部分地来,将会把整理结果都汇总到这一篇文章中。

    注意:本文最后给出了难题征解,而且这些难题将逐渐地添加到本文中。实用案例背景是一篇使用扫描仪刚刚扫描的中英文混合型文章的编辑。

    首先,来看一下WORD对于正则表达式的支持吧。

    用于查找

    类型

    示例

    任一字符

    ?

    s?t 可找到“sat”和“set”。

    任何字符串

    *

    s*d 可找到“sad”和“started”。

    单词开头

    <

    单词结尾

    >

    (in)> 可找到“in”和“within”,但找不到“interesting”。

    指定字符之一

    [ ]

    w[io]n 可找到“win”和“won”。

    此范围内的任一字符

    [-]

    [r-t]ight 可找到“right”和“sight”。范围必须是升序。

    除了括号内范围中的字符之外的任一字符

    [!x-z]

    t[!a-m]ck 可找到“tock”和“tuck”,但找不到“tack”或“tick”。

    前一个字符或表达式的 n 个匹配项

    {n}

    fe{2}d 可找到“feed”,但找不到“fed”。

    前一个字符或表达式的至少 n 个匹配项

    {n,}

    fe{1,}d 可找到“fed”和“feed”。

    前一个字符或表达式的 n 到 m 个匹配项

    {n,m}

    10{1,3} 可找到“10”、“100”和“1000”。

    前一个字符或表达式的一个或多个匹配项

    @

    lo@t 可找到“lot”和“loot”。

    PUZZLE 1:把近似有规律的许多连续的半角空格字符替换为制表符?

    例如如下分布的一些英语单词:

    English    英语/英语的

    Chinese   汉语/汉语的

    ...

    注意,上面单词后面都跟了2个或者2个以上的空格字符。

    于是我们可以构造下面的查找表达式(左边大括号的左边是一个半角空格字符):

    {2,}

    注意,还要选择使用通配符(必须的)。

    替换表达式是: ^t

    PUZZLE 2:如何把类似于"明文与官方",甚至是"51CTO文章相关"的所有内容中的这一对半角双引号一下替换成成对的全角双号?

    参考答案如下:

    先上一幅图(哈哈,我现在在整理学校需要的一篇资料,正是使用扫描仪扫描的结果,非常混合,因此编辑与排版时非常麻烦才促使我想点快捷的方法4ebc32092102d508cedcc09c4e654292.gif)

    44966f47deae10fe4ff3e296a8a5a7ab.png

    请各位看清其中的使用荧光笔勾出的部分。现在我的目的是:想把所有成对的半角双引号替换成成对的全角双引号!!!---后面我还有大量的这些类似内容要处理呢...

    替换及输入内容如下图所示:

    ae8a163a6d3ef6ea654775abb36570bf.png

    请小心其中的全角和半角,啊!

    替换后,得到下图所示结果:

    821fa091e970053c57332d4c8ea03cc2.png

    好了,问题解决了!

    怎么,你没有看出来吗?----再次使用一下替换即可了(此时全角的成对的中文上引号与下引号是有区别的)3c2498ae2fd026894b1ad0eb83d641ec.png

    当然了,如果把此问题扩大一下的话,还有至少两个问题(请自己想想吧)要解决......

    另外,看到网络上有一个小文,说使用如下方法:

    可以用查找与替换功能选中所有英文引号,然后将字体选择为“宋体”

    很遗憾,他说的这个方法是利用了这个原理:默认情况下,WORD中中文使用的是宋体,而英文(包括半角的字母数字和标点)都使用的是Times New Roman字体。但是,很遗憾,我使用扫描仪扫描的文章中所有半角标点,在进入到WORD时其字体都是宋体,该死!!!而且,还该死的是,我把试验了一下,把这些宋体的英语引号改为Times New Roman字体,再使用上面小文中所说的,都不管用了???而且,我也注意到我使用的模板是WORD内置模板文件Normal.dot,再创建一个空白新文件,输入中文英文规律如以前一样。唉!看来这个小文中说的只能解决了一种情况吧。

    再补充:--不补充不行f95c32c8725c574ff2a48461e102da11.giff95c32c8725c574ff2a48461e102da11.giff95c32c8725c574ff2a48461e102da11.giff95c32c8725c574ff2a48461e102da11.giff95c32c8725c574ff2a48461e102da11.gif

    再说一下类似的问题:

    怎么把word里的英文双引号" "变成中文的双引号“” ?

    我这是一篇很长的文档,里面是中文,但是却又大量的英文双引号 " " ,由于英文字符的双引号的前引号和后引号是一模一样的,所以用查找替换就会把前引号和后引号全部替换成相同的中文引号字符了,这个的方法是行不通的。

    f95c32c8725c574ff2a48461e102da11.gif快速解决如下:

    1.关闭自动更正功能(直引号为弯引号)。

    具体地说,对应菜单“工具”-“自动更正选项”,

    在“键入时自动套用格式”这个选项卡中有一项默认情况是“直引号替换为弯引号”前面有一个钩子,去掉之!!!

    2.完成替换:将"(*)"替换为“1”

    使用word里的高级查找替换功能! 一下子搞定!!!

    Puzzle 3:怎么在word里去掉所有的汉字?

    参考答案如下:

    按住“ctrl+H”组合键,在弹出的“查找和替换”窗口的“高级→查找内容”处填上“[一-�]”,(提示:“�”字是繁体,拼音为yù,谷歌输入法可切换简繁输入),注意勾选“使用通配符”,这样就能查找所有中文字体,最后替换为空,就可以删除全部的中文了。反过来,如果要保留单词中文意思而删除英文,只要要查找内容处输入“^$”就可以了,操作非常方便。

    Puzzle 4:如何查找一对汉字小括号及其中内容?

    参考答案如下(尚未彻底解决):

    使用[(“]*[”)]或者[((]*[))]

    补充:查找到以后,例如要删除,这个很好办,要对其中内容进行基本排版,这个也好办。但是,要修改成其他内容呢?我是说包含这一对汉字小括号?这个问题解了,上面的PUZZLE 2也就解了。

    当然,我还知道一个办法是使用VBA宠编程,然后运行宏。但是,这个对于普通办公人员要求可能高了。当然,制作出来让他们用完全可以的。我现在还没有时间研究这个,有兴趣的朋友可以先试试。

    展开全文
  • 如要将一个Word文档内的两个汉字中间的空格替换掉(之所以要特定要求两个汉字中间,是为了避免文本中的英文空格替换掉),可以使用查找、替换的通配符。查找:([一-﨩])( )([一-﨩])替换:13写成VBA代码:Sub 替换()...

    如要将一个Word文档内的两个汉字中间的空格替换掉(之所以要特定要求两个汉字中间,是为了避免文本中的英文空格替换掉),可以使用查找、替换的通配符。

    91e3b622dc2f5c6c0491f7a0f1af4516.png

    查找:([一-﨩])( )([一-﨩])

    替换:13

    写成VBA代码:

    Sub 替换()With Selection.Find .Text = "([一-﨩])( )([一-﨩])" .Replacement.Text = "13" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = True End With Selection.Find.Execute Replace:=wdReplaceAllEnd Sub

    如果使用正则的选择、查找、替换,则会有副作用,因为要先选择,会将其中的文本格式、图片都替换掉。

    Sub replacetxt222() Dim regex As Object Dim regMatch As Object Set regex = CreateObject("VBScript.RegExp") Dim str As String str = Selection.Text With regex .Pattern = "([一-﨩])( )([一-﨩])" .MultiLine = True .Global = True .IgnoreCase = True str = .Replace(str, "$1$3") Debug.Print (str) End With Selection.Text = strEnd Sub

    当然也可以将中文中的半角标点替换为全角:

    002e652c9e315c31c5650578d223a900.png

    ([一-﨩])(,)([一-﨩])

    1,3

    通配符的一般规则为:

    da686b3183ec41b58f8945b899d17b1e.png

    如() ()就可以分组匹配两个单词,中间有空格。

    另外,d在正则中表示数字,而在查找、替换对话框中是没有这一写法的,可以用以下表达式表示:

    [0-9]{1,2}

    表示匹配一个或两个数字。

    需要注意的是,VBA的正则表达式与查找对话框中的通配符的写法与支持的功能是有所区别的。

    查找、替换对话框中不使用通配符时,可用^#来表示数字,其“特殊格式”的弹出菜单为:

    236fb75cd67d8be579976a9b0ce83e32.png

    如段落标记^p,通配符中用^13表示。

    查找、替换对话框中使用通配符时,其“特殊格式”的弹出菜单为:

    ecdd3fb336b9d0df06d17dc06a091b55.png

    一些常用的特殊格式的通配符写法可以从以上弹出菜单中得到帮助。

    -End-

    展开全文
  • 正则表达式应用非常广泛,例如:php,Python,java等,但在linux中最常用的正则表达式的命令就是grep(egrep),sed,awk等,换句话 说linux三剑客要想能工作的更高效,就一定离不开正则表达式的配合。 1、什么是正则...
  • JS正则表达式完整版

    万次阅读 多人点赞 2018-07-17 13:14:13
    第一章 正则表达式字符匹配攻略 1 两种模糊匹配 2. 字符组 3. 量词 4. 多选分支 5. 案例分析 第1章 小结 第二章 正则表达式位置匹配攻略 1. 什么是位置呢? 2. 如何匹配位置呢? 3. 位置的特性 4. 相关...
  • Word查找栏代码·通配符一览表序号清除使用通配符复选框勾选使用通配符复选框特殊字符代码特殊字符代码or通配符1任意单个字符^?任意单个字符?2任意数字^#任意数字(单个)[0-9]3任意英文字母^$任意英文字母[a-zA-Z]4...
  • 目录: 一、正则表达式简介 二、正则表达式符号的含义以及简单的例子 ... 3.1正则表达式应用——替换指定内容到行尾 3.2正则表达式应用——数字替换 3.3正则表达式应用——删除每一行行尾的指定字符 ...
  • 什么是正则表达式正则表达式是由一个字符序列形成的搜索模式。当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。 正则表达式可以是一个简单的字符,或一个更复杂的模式。可用于所有文本搜索和文本...
  • 但当这样需要添加的索引非常多的时候,逐个手动添加上标显然不是最佳方法,这里就需要使用word正则表达式进行替换。 按下Ctrl+H,或在“开始”标签栏右侧找到“替换”,单击“更多”: 勾选“使用通配符”: ...
  • 正则表达式的基本语法及使用正则表达式完成字符串的检索、替换、查找。
  • 正则表达式要放在()中,替换中的\1代表被替换的第一个表达式,即第一个()中匹配到内容。
  • 正则表达式是什么?可以理解为文本的一种抽象特征,通过特定的符号规则,来对应特定的文本。这里我们实践的是python中的正则表达式。python中使用正则表达式很简单,包括下面4个简单步骤:引入正则表达式模块,...
  • 一、Python正则表达式re模块简介正则表达式,是一门相对通用的语言。简单说就是:用一系列的规则语法,去匹配,查找,替换等操作字符串,以达到对应的目的;此套规则,就是所谓的正则表达式。各个语言都有各自正则...
  • 正则表达式是对字符串操作的一种逻辑公式;作用:检索、替换那些符合某个模式(规则)的文本,可以通过一些设定的规则来匹配一些字符串,是一个强大的字符串匹配工具。正则表达式,又称规则表达式。(英语:Regular ...
  • 正则表达式之前学习的时候,因为很久没怎么用,或者用的时候直接找网上现成的,所以都基本忘的差不多了。所以这篇文章即是笔记,也让自己再重新学习一遍正则表达式。     其实平时在操作一些字符串的时候,用...
  • 正则表达式 Regular有规律的 Expression表达式 正则表达式regex 一个带有一定规律的表达式 匹配字符串格式的 正则表达式通常的作用如下: 1.字符串的格式校验 String类中提供的一个方法 boolean = str.matches(...
  • 正则表达式pythonWe live in an information age where large volumes of data abound and the ability to extract meaningful information from data is a key differentiator for success. Fields such as ...
  • awk 使用正则表达式 在awk中,正则表达式(regex)允许动态和复杂的模式定义。 您不仅限于搜索简单的字符串,而且还搜索模式中的模式。 使用正则表达式匹配awk中的行的语法为: word ~ / match / 相反的是不...
  • 正则表达式 高级用法Regular Expressions are a useful thing to learn. Essentially, they are a tool for parsing text.正则表达式是学习有用的东西。 本质上,它们是解析文本的工具。 They are present in almost...
  • scala 正则表达式Regular expressions are pattern matching utilities found in most of the programming languages. They define a generic pattern to match a sequence of input characters. Regex are widely ...
  • 在学习JavaScript的时候,接触到了正则表达式,以前写C#的时候光知道但是并没有总结如何自己写,也没有研究正则表达时候具体如何应用(毕竟网上一搜一大堆),今天就这个问题我还是写一篇博客总结一下,针对正则...
  • Word中使用正则表达式进行查找和替换 在实际开发中经常使用对WORD/EXCEL及其他数据格式的整理,其中之一便是使用WORD中的查找与替换功能整理数据。 对于最一般的查找与替换功能相信各位都熟悉了,但是借助于WORD所...
  • 元字符 描述 ...例如正则表达式weasel$ 能够匹配字符串"He's a weasel"的末尾 ,但是不能匹配字符串"They are a bunch of weasels." ^ 匹配一行的开始。例如正则表达式^When in能够匹
  • 利用JAVA正则表达式
  • 简单地说,正则表达式就是一套处理字符串的规则和方法,以行为单位对字符串进行处理,通过特殊的符号的辅助,我们可以快速的过滤,替换某些特定的字符串。 运维工作中,会有大量访问日志,错误日志,大数据。如何...
  • linux正则表达式函数式This section contains Aptitude Questions and Answers on Linux Regular Expressions. 本节包含有关Linux正则表达式的 Aptitude问答。 1) There are the following statements that are ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,592
精华内容 10,236
关键字:

word替换正则表达式