正则表达式的环视实际应用案例
一、千位分隔符案例(一)
逆序環(huán)視和順序環(huán)視結(jié)合應(yīng)用。
**需求:**數(shù)字格式化成用 , 分隔的貨幣格式。
正則表達(dá)式:(?n)(?<=\d)(?<!\.\d*)(?=(\d{3})+(\.|$))
測(cè)試代碼:
double[] data = new double[] { 0, 12, 123, 1234, 12345, 123456, 1234567, 123456789, 1234567890, 12.345, 123.456, 1234.56, 12345.6789, 123456.789, 1234567.89, 12345678.9 };foreach (double d in data) {richTextBox2.Text += "源字符串:" + d.ToString().PadRight(15) + "格式化:" + Regex.Replace(d.ToString(), @"(?n)(?<=\d)(?<!\.\d*)(?=(\d{3})+(\.|$))", ",") + "\n"; }輸出結(jié)果:
源字符串:0 格式化:0源字符串:12 格式化:12源字符串:123 格式化:123源字符串:1234 格式化:1,234源字符串:12345 格式化:12,345源字符串:123456 格式化:123,456源字符串:1234567 格式化:1,234,567源字符串:123456789 格式化:123,456,789源字符串:1234567890 格式化:1,234,567,890源字符串:12.345 格式化:12.345源字符串:123.456 格式化:123.456源字符串:1234.56 格式化:1,234.56源字符串:12345.6789 格式化:12,345.6789源字符串:123456.789 格式化:123,456.789源字符串:1234567.89 格式化:1,234,567.89源字符串:12345678.9 格式化:12,345,678.9實(shí)現(xiàn)分析:
首先根據(jù)需求可以確定是把一些特定的位置替換為 ,,接下來就是分析并找到這些位置的規(guī)律,并抽象出來以正則表達(dá)式來表示。
這個(gè)位置的左側(cè)必須為數(shù)字
這個(gè)位置右側(cè)到出現(xiàn) . 或結(jié)尾為止,必須是數(shù)字,且數(shù)字的個(gè)數(shù)必須為 3 的倍數(shù)
這個(gè)位置左側(cè)相隔任意個(gè)數(shù)字不能出現(xiàn) .
由以上三條,就可以完全確定這些位置,只要實(shí)現(xiàn)以上三條,組合一下正則表達(dá)式就可以了。
根據(jù)分析,最終匹配的結(jié)果是一個(gè)位置,所以所有子表達(dá)式都要求是零寬度。
是對(duì)當(dāng)前所在位置左側(cè)附加的條件,所以要用到逆序環(huán)視,因?yàn)橐蟊仨毘霈F(xiàn),所以是肯定的,符合這一條件的子表達(dá)式即為 (?<=\d)
是對(duì)當(dāng)前所在位置右側(cè)附加的條件,所以要用到順序環(huán)視,也是要求出現(xiàn),所以是肯定的,是數(shù)字,且個(gè)數(shù)為3的倍數(shù),即 (?=(\d{3})+),到出現(xiàn) . 或結(jié)尾為止,即 (?=(\d{3})+(\.|$))
是對(duì)當(dāng)前所在位置左側(cè)附加的條件,所以要用到逆序環(huán)視,因?yàn)橐蟛荒艹霈F(xiàn),所以是否定的,即 (?<!\.\d*)
因?yàn)榱銓挾鹊淖颖磉_(dá)式是非互斥的,最后匹配的都是同一個(gè)位置,所以先后順序是不影響最后的匹配結(jié)果的,可以任意組合,只是習(xí)慣上把逆序環(huán)視寫在左側(cè),順序環(huán)視寫在右側(cè)。
說明:這里只是為了說明環(huán)視的使用而舉的一個(gè)例子,實(shí)際上這個(gè)需求直接用 string.Format 就可以做到。
二、千位分隔符案例(二)
千位分隔符,顧名思義,就是數(shù)字每隔三位添加一個(gè)逗號(hào)。這是參考西方的習(xí)慣,在數(shù)字之中加入一個(gè)符號(hào),避免因數(shù)字太長(zhǎng)難以直觀的看出它的值。
那么怎么將一串?dāng)?shù)字轉(zhuǎn)化為千位分隔符形式呢?
var str = "1234567890.9876"; console.log((+str).toLocaleString()); // 1,234,567,890.988如上,toLocaleString() 返回當(dāng)前對(duì)象的“本地化”字符串形式。
我們嘗試使用環(huán)視來處理下:
var str = 1234567890; function thousand(str){return str.replace(/(?!^)(?=([0-9]{3})+$)/g,','); // 進(jìn)行了好多次迭代匹配,匹配到 3 個(gè)位置,把匹配到的位置替換成逗號(hào) } console.log(thousand(str));//"1,234,567,890" console.log(thousand("123456"));//"123,456" console.log(thousand("1234567879876543210"));//"1,234,567,879,876,543,210"上述使用到的正則表達(dá)式分為兩塊 (?!^) 和 (?=([0-9]{3})+$)。我們先來看后面的部分,然后逐步分析之。
三、順序肯定環(huán)視
假如現(xiàn)在,js 通過 ajax 獲取到一段 html 代碼如下:
var responseText = "<div data='dev.xxx.txt'></div><img src='dev.xxx.png'/>";現(xiàn)我們需要替換 img 標(biāo)簽的 src 屬性中的 dev 字符串為 test 字符串。
由于上述 responseText 字符串中包含至少兩個(gè)子字符串 dev,顯然不能直接 replace 字符串 dev 為 test;
同時(shí)由于 js 中不支持逆序環(huán)視,我們也不能在正則中判斷前綴為 src=',然后再替換 dev;
我們注意到 img 標(biāo)簽的 src 屬性以 .png 結(jié)尾,基于此,就可以使用順序肯定環(huán)視。
當(dāng)然,以上不止順序肯定環(huán)視一種解法,捕獲性分組同樣可以做到。那么環(huán)視高級(jí)在哪里呢?環(huán)視高級(jí)的地方就在于它通過一次捕獲就可以定位到一個(gè)位置,對(duì)于復(fù)雜的文本替換場(chǎng)景常有奇效,而分組則需要更多的操作。
總結(jié)
以上是生活随笔為你收集整理的正则表达式的环视实际应用案例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 正则表达式的固化分组
- 下一篇: 天龙八部游戏名字大全,天龙八部有诗意的名