1. 程式人生 > >正則表示式-如何從一個字串中拿到特定內容

正則表示式-如何從一個字串中拿到特定內容

做Web開發時,經常需要從一個訊息中去取得自己需要的欄位資訊,如果這個訊息是Json或XML型別那很方便。但如果是個字串呢,就像下面這樣:

val str = “window.code=200;window.redirect_uri=\”wx.qq.com/cgi-bin/mmwebwx-bin/[email protected]_0&uuid=Yaw97YVBXQ==&lang=zh_CN&scan=1492838576\”;”

以下就是我做微信機器人時遇到的其中一種情況,需要從這個字串中獲取它的狀態碼(200)以及跳轉的uri(wx.qq.com/cgi-bin/mmwebwx-bin/
[email protected]
_0&uuid=Yaw97YVBXQ==&lang=zh_CN&scan=1492838576)

起初我不瞭解正則表示式,看到它這麼多的表示式型別,覺得這麼多東西怎麼記得住,即使花時間記住了過段時間也忘了。因此我一直沒有深入的去理解正則表示式。我也一直以為正則表示式都是用來匹配某個模式串是否存在的,比如檢測在”hello word”中是否有hello,畢竟很多的教程一上來都是說的這個。因此我起初對於這種在字串獲取特定的值,做法都是用sprit(),比如str.sprit(“;”)(0).sprit(“window.code=”)(1)
來取到200,但是這種做法非常可怕,前提是要求字串的格式永遠不變,一旦格式發生些許變化,比如code和=之間多了一個空格,結果必然是一堆報錯,最常見的就是陣列越界。直到我後來看到了一篇講正則表示式的文章正則表示式30分鐘入門教程

發現我們可以用分組的方式很優雅的完成上面的工作。

先直接上程式碼,這裡面用到了java工具包中的regex

import java.util.regex.Pattern
//程式語言用的Scala,java也類似,但這裡重點講的是正則表示式pattern
val str = "window.code=200;window.redirect_uri=\"wx.qq.com/cgi-bin/mmwebwx-bin/
[email protected]
_0&uuid=Yaw97YVBXQ==&lang=zh_CN&scan=1492838576\";"
val pattern = Pattern.compile(""".*window.code *= *(\d*).*window.redirect_uri *= *"(.*)".*""") val matcher = pattern.matcher(str) val boolean = matcher.matches()//true or false val code = matcher.group(1)//200 val uri = matcher.group(2)//wx.qq.com.....

我們著重來看這個正則表示式

.*window.code *= *(\d*).*window.redirect_uri *= *”(.*)”.*

我們先將這個表示式簡化一下

window.code=(\d*);window.redirect_uri=”(.*)”;

三個引號包括的字串在Scala中也是表示字串的意思,只是這裡面的特殊字元不用加轉義符“\”,這樣看的比較直觀。如果你的字串用”“包括的話還是需要給特殊字元加上轉義符。

這裡\d*表示有零個或多個數字,.*表示有零個或多個字元,那為什麼要用括號括起來呢?這裡面就用到了分組,也就是下面的group。如果匹配成功,即boolean為true,括號中匹配的字串就會存到group中,group順序從1開始,有幾對括號就有幾個group,因此我們之後可以從group(1)中拿到200,在group(2)中拿到wx.qq.com/……&scan=1492838576

至於程式碼裡更復雜的正則表示式,無非是加了一些特殊情況的判斷,比如判斷空格,或者前後有無多餘字元等。

最重要的還是具體問題具體分析,這裡只講到了分組的功能,如何從一個字串中拿到特定的內容,具體的更深入的正則表示式知識我們就可以去這篇教程(正則表示式30分鐘入門教程)裡找對應的表示式就好了

相關推薦

使用表示式刪除一個字串特定兩個字元之間的所有字元

刪除兩個%之間的所有字元: String s = "http://media.advu.cn/stat/index?f=1001&eventid=266&tvType=

表示式-如何一個字串特定內容

做Web開發時,經常需要從一個訊息中去取得自己需要的欄位資訊,如果這個訊息是Json或XML型別那很方便。但如果是個字串呢,就像下面這樣: val str = “window.code=200;window.redirect_uri=\”wx.qq.co

java用表示式判斷一個字串是否是車牌號

public boolean checkCarNumber(String content) { String pattern = "([京津滬渝冀豫雲遼黑湘皖魯新蘇浙贛鄂桂甘晉蒙陝吉閩貴粵青藏川寧瓊]{1}(([A-HJ-Z]{1}[A-HJ-NP-Z0-9]{5})|([A-HJ-

python 表示式找出字串的純數字

1、簡單的做法 >>> import re >>> re.findall(r'\d+', 'hello 42 I'm a 32 string 30') ['42', '32', '30'] 然而,這種做法使得字串中非純數字也會識別 >

在Java中用表示式判斷一個字串是否是數字的方法

package chengyujia; import java.util.regex.Pattern; public class NumberUtil { /** * 判斷一個字串是否是數字。 * * @param string *

表示式:只保留字串的漢字和字母

echo iconv('utf-8', 'gbk', preg_replace('/[^a-zA-Z\x{4e00}-\x{9fa5}]/u', '', iconv('gbk', 'utf-8', $str_word)));exit;

Python 表示式Windows路徑獲取資料夾

<pre name="code" class="python">1. Regular Expression ^([a-zA-Z]:|\\\\[a-zA-Z0-9_.$ -]+\\[a-z0-9_.$ -]+)?((?:\\|^)(?:[^\\/:*?"<&

Java呼叫replaceAll方法通過表示式把HTML字串的img標籤的src預設屬性值uri補全

class Test { public static void main(String[] args) { String domain = "http://avatar.csdn.net";

js表示式判斷一個字串是否是正確的有數字和小數點組成的金錢形式和 判讀數值型別的表示式

http://www.cnblogs.com/dearxinli/p/4079518.html function checkRates(str){ var re = /^(([1-9][0-9]*\.[0-9][0-9]*)|([0]\.[0-9][0-9]*)

利用表示式檔案路徑匹配檔名

第一種,檔名不包含副檔名: 正則表達寫法:([^<>/\\\|:""\*\?]+)\.\w+$ java中的寫法: …… String reg = "([^<>/\\\\|:\"\"\\*\\?]+)\\.\\w+$+"; Matcher m = P

java使用表示式一長串字元獲取一段特徵字串

只能說String工具類太強大,導致一直以來,幾乎沒怎麼用到過正則表示式,現在突然要用到,參考正則表示式語法,摸索一上午才搞出來。記錄分享一下,以免忘記 從一長串字元中,截取出邀請碼,我想很多人都遇到過。 String s = "邀請您加入隨心購,自動搜尋淘寶天貓優惠券!先領券,再購

python表示式字串提取數字

python從字串中提取數字 使用正則表示式,用法如下: ## 總結 ## ^ 匹配字串的開始。 ## $ 匹配字串的結尾。 ## \b 匹配一個單詞的邊界。 ## \d 匹配任意數字。 ## \D

java中用表示式獲取一個指定的子字元在字串出現的指定次數的下標索引,並且進行字串分割

在開發中遇到這樣的一個報文: 00000123000003RQ0 ################ 000003 <tellerLvl0>0</><brc>3004</><fPIflag>0</><

使用表示式字串查詢子字串

直接上程式碼: String string = "asdasd#_%12.gifdadsa#_%2324.gif"; String regx = "#_%\\d+.gif"; Patter

QT 用表示式tableView篩選出某一日期範圍內的資料

QDate date1,date2; date1=ui->dateEdit_2->date();//提取開始時間 date2=ui->dateEdit_3->date();//提取結束時間 data_filter->

vba查詢當前目錄下所有文字檔案滿足表示式要求的字串

Dim DicFolders As Variant Private Sub ExportFormat(format As String) Dim ArrFileName() As String, ArrLan() As String, i& Dim sheetName As

【python學習筆記】用表示式含中文的網頁提取資料(含編碼轉換)

目標:用正則表示式從含中文的網頁中提取資料 1、獲得網頁全部資料 1.1思考過程 確定我們要操作的網頁:url = 'http://q.stock.sohu.com/cn/603077/cwzb.shtml' 開啟要操作的網頁:req = urllib2.open(url)

表示式:檢查一個句子或者字串是否以大寫字母開頭,以句號結尾.

正則表示式就是構造一個描述要找文字串的表示式,是一種描述性語言,不是直接給出要找的文字串序列,當然這樣也行。 比如在java中有些正則表示式示例: “the\W+” 表示以the這三個字母開頭然後緊

pandas 利用 表示式 文字提取數字

需要從text特徵中提取形如 13.5/10 這樣的字串,再分別提取分子分母。 1)可以利用 str.extract() 方法。 2)利用正則表示式 \d+\.?\d*\/\d+ 進行匹配 3)再

表示式一個應用(替換字串

原料:1 一個要替換的字串 2 正則表示式 3 json物件 包含將要被替換的字串以及替換字串while(result=reg.exec(str)){}來判斷是否有匹配的字串 var key = result[0] 要被替換的字串var value = obj[key] 替換