《正则表达式必知必会》读书笔记1

本文通过实例详细解析了正则表达式的语法与功能,包括匹配纯文本、任意字符、特殊字符等,帮助读者掌握正则表达式的使用技巧。

正则表达式测试器下载(网页版):http://www.forta.com/books/0672325667/

你也可以新建一个文本文件,然后复制本文最后附加的网页代码到文件,文件名后缀修改为“.html”,双击运行即可。
一.什么是正则表达式?
简 单地说,正则表达式就是一些用来匹配和处理文本的字符串。正则表达式是用正则表达式语言创建的。与其他程序设计语言一样,正则表达式语言也有需要学习的特 殊语法和指令。但是,正则表达式语言并不是一种完备的程序设计语言,它甚至算不上是一种能够直接安装并运行的程序。准确地说,正则表达式语言是内置于其他 语言或软件产品里的“迷你”语言。
正则表达式的使用方法和具体功能,在不同的应用程序/语言中各有不同。一般来说,应用程序大多使用菜单选项和对 话框来访问正则表达式,而程序设计语言大都在函数或对象类中使用正则表达式。此外,并非所有的正则表达式实现都是一样的。在不同的应用程序/语言里,正则 表达式的语法和功能往往会有明显(有时也不那么明显)的差异。
二.以例子说明正则表达式的语法和功能
进行操作的文本对象:
hello,my name is xyf.who are you?
regex.txt
segex.txt
megex.txt
reg1.txt
reg2.txt
rega.txt
regz.txt
正则表达式操作:
1.匹配纯文本 :xyf
结果:
Match    Position    Length
xyf         17            3
2.匹配任意字符 :.e或者.e.
结果:(1)
Match    Position    Length
he          0            2
me       11            2
re         26            2
re         34            2
ge        36            2
se        44            2
ge        46            2
re        54            2
re        63            2
re        72            2
re        81            2
(2)
Match    Position    Length
hel         0              3
me        11            3
re          26            3
reg        34            3
seg        44            3
reg        54            3
reg       63            3
reg       72            3
reg       81            3
注:符号.能匹配除换行符以外的任意一个符号,包括自己本身。
如果你曾经使用过DOS的文件搜索功能,你将发现正则表达式里的.字符相当于DOS的?字符。SQL用户将注意到正则表达式里的.字符相当于SQL中_(下划线)字符。
3.匹配特殊字符 :e./.txt
结果:
Match    Position    Length
ex.txt    37            6
ex.txt    47            6
注:由于一些特殊的符号在正则表达式中被赋予了特殊的专用功能,所以如果要在文本中匹配这个符号本身的话就必须用转义符/,如果我们换个正则表达式e..那么结果会是什么呢?如下:
Match    Position    Length
ell           1            3
e i         12            3
e y        27            3
ege       35            3
ege      45            3
ege      55            3
eg1      65            3
eg2      74            3
ega      83            3
egz      92            3
如果需要搜索/本身,就必须对/字符进行转义,相应的转义序列是两个连续的反斜杠字符//
4.匹配多个字符中的某一个 :[rms]egex.txt
结果:
Match        Position    Length
regex.txt     34           9
segex.txt     44           9
megex.txt    54          9
5.利用字符集合区间 :reg[1-9a-z]/.txt
结果:
Match        Position    Length
reg1.txt      64           8
reg2.txt      73           8
rega.txt      82           8
regz.txt      91           8
如果换作reg[1-9]./txt则结果为:
Match        Position    Length
reg1.txt      64           8
reg2.txt      73           8
6.取非匹配 :reg[^1-9].txt
结果:
Match        Position    Length
rega.txt       82          8
regz.txt       91          8
注:^的效果将作用于给定字符集合里的所有字符或者字符区间,而不是仅限于跟在^字符后面的那一个字符或者字符区间。
在这个正则表达式测试器中默认是不区分大小写的。如果测试器默认区分大小写的话,比如在文本中有regex.txt和Regex.txt,你可以用[R|r]egex.txt或者[Rr]egex.txt来匹配。
(未完待续)

附(正则表达式测试器网页代码):

<HTML>
<HEAD>
<TITLE>Regular Expression Test Page</TITLE>

<!--- Some styles to make the page look nice --->
<STYLE>
  BODY {font-family:arial;font-size:12px}
  INPUT {font-size:11px}
  TEXTAREA {font-size:11px}
  TH {background:#8888FF;color:white;text-align:left}
  TD {background:#CCCC99;color:black;font-size:12px}
  TD.RowA {background:#CCCC99}
  TD.RowB {background:#EEEEBB}
  .header {font-weight:bold}
</STYLE>

<SCRIPT LANGUAGE="JavaScript">
// Turn off fields used only by replace
function hideReplaceFields() {
  document.getElementById('RegExReplace').disabled=true;
  document.getElementById('replaceheader').disabled=true;
}

// Turn on fields used only by replace
function showReplaceFields() {
  document.getElementById('RegExReplace').disabled=false;
  document.getElementById('replaceheader').disabled=false;
}

// Perform a find
function processRegexFind(text, regex, flags) {
    var reg = new RegExp(regex, flags);
    var lastIdx = -1;
    var iCount = 0;
    var result = "";
    var output = '<DIV STYLE="height:200px;overflow-y:auto;width:550">' +
                 '<TABLE BORDER="0" CELLPADDING="2" CELLSPACING="0" WIDTH="550">' +
                 '<TR><TH WIDTH="*">Match</TH><TH WIDTH="50">Position</TH><TH WIDTH="50">Length</TH></TR>';

    // Loop as long as have matches
    while (lastIdx != 0)
    {
        // Do it
        var mtch = reg.exec(text);
       
        // Check if got one
        if (reg.lastIndex != 0)
        {
            // Yep, increment counter
            iCount++;

            if (iCount % 2)
                style = "RowA";
            else
                style = "RowB";
            // Write output
            output += '<TR CLASS="' + style + '"><TD>' +
                        RegExp.lastMatch + "</TD><TD>" +
                        (reg.lastIndex-RegExp.lastMatch.length) + "</TD><TD>" +
                        RegExp.lastMatch.length + "</TD></TR>";
        }
       
        lastIdx = reg.lastIndex;
    }
   
    output += "</TABLE>";

    // Build result
    if (iCount != 0)
        result = "Matches Found: " + iCount+ "<BR>" + output;
    else
        result = "No matches";       
       
    return result;
}

// Process a replace
function processRegexReplace(text, regexfind, regexreplace, flags) {
    // Define regex
    var re = new RegExp (regexfind, flags) ;
    // Do it
    var newstr = text.replace(re, regexreplace) ;
    // Generate output
    var result = '<DIV STYLE="height:200px;overflow-y:auto;width:550">' +
                 '<TABLE BORDER="0" CELLPADDING="2" CELLSPACING="0" WIDTH="550">' +
                 '<TR><TH>New Text</TH></TR><TR><TD>' +
                 newstr + '</TD></TR>';

return result;
}

// Process entry point
function processRegex(form) {
    var output="";
    var flags;
    if (form.CaseSensitive.checked)
        flags = "g";
    else
        flags = "gi";

    // What to do?
    if (form.OperationFind.checked) {
        output=processRegexFind(form.SearchText.value, form.RegEx.value, flags);
    }
    else if (form.OperationReplace.checked) {
        output=processRegexReplace(form.SearchText.value, form.RegEx.value, form.RegExReplace.value, flags);
    }

    document.getElementById('output').innerHTML=output;
       
    return false;
}
</SCRIPT>
</HEAD>

<BODY>

<FORM NAME="tester" ACTION="" METHOD="post" onSubmit="processRegex(this);return false">
   

<TABLE BORDER="1" CELLPADDING="4" CELLSPACING="0" WIDTH="550">
  <TR>
    <TH CLASS="Dialog">Regular Expression Tester</TH>
  </TR>
  <TR>
    <TD CLASS="Dialog">

    <!--- Text input for the regular expression itself --->
    <SPAN CLASS="header">Enter a regular expression:</SPAN><BR>
    <INPUT NAME="RegEx" TYPE="Text" SIZE="65" STYLE="font-size:13px">

    <!--- Checkbox to control case-sensitivity --->
    <INPUT TYPE="Checkbox" NAME="CaseSensitive" ID="CaseSensitive" VALUE="Yes">
    <LABEL FOR="CaseSensitive">Case sensitive</LABEL>
    <BR>

    <!--- Radio buttons to display find vs. replace --->
    <INPUT TYPE="Radio" NAME="Operation" ID="OperationFind" VALUE="find" CHECKED onClick="hideReplaceFields()">
    <LABEL FOR="OperationFind">Find</LABEL>

    <INPUT TYPE="Radio" NAME="Operation" ID="OperationReplace" VALUE="replace" onClick="showReplaceFields()">
    <LABEL FOR="OperationReplace">Replace</LABEL>
    <BR>

    <!--- Text input for the replace regular expression --->
    <SPAN CLASS="header" ID="replaceheader">Enter the replace regular expression:</SPAN><BR>
    <INPUT ID="RegExReplace" NAME="RegExReplace" TYPE="Text" SIZE="65" STYLE="font-size:13px">
    <BR><BR>

    <!--- Textarea where user can type the text to search ---> 
    <SPAN CLASS="header">And the text you wish to search:</SPAN><BR>
    <TEXTAREA NAME="SearchText" WRAP="off" COLS="70" ROWS="6"></TEXTAREA>
    <BR>

    <!--- Submit button to start the search ---> 
    <INPUT NAME="Submit" TYPE="Submit" STYLE="font-weight:bold" VALUE="Match Now"></TD>
  </TR>
</TABLE>

 
</FORM>

<!-- Display any reults here --->
<SPAN id="output"></SPAN>

<!-- Default to find --->
<SCRIPT LANGUAGE="JavaScript">
hideReplaceFields();
</SCRIPT>

</BODY>
</HTML>

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值