2012-10-31 62 views
0

我該如何將它寫成正則表達式?如何構建一個字符串的正則表達式?

「BLOCKa中#123#456」

我已經使用#符號在數據 參數分裂和參數塊名,STARTX座標,啓動ÿcorrdinate

這是嵌入在數據在我的QR code.so當我掃描QR我想檢查它是否正確的QR他們正在掃描。爲此,我需要上述語法的正則表達式。

我的方法體

public void Store_QR(String qr){ 
    if(qr.matches(regular Expression here)) { 
     CurrentLocation = qr; 
    } 
    else // Break the operation 
} 
+0

什麼是你的QR碼的確切模式,你能舉出更多的例子嗎? –

+1

請詳細解釋您想要匹配的具體內容。例如。 #是什麼,它們是否代表任何數字或文字字符#,是文字字符串「blocka」中的「blocka」部分還是隻是6個字符長度的文本示例。回答這些問題會使正則表達式自我解釋。我相信,如果你回答這些問題,你可以自己回答這個問題,通過學習正則表達式來增強自己的能力。 – hsanders

+0

字符串模式是BlockName#start_X#end_X – Ruby

回答

1

myregexp.com很高興做一些測試。

官方Java Regex Tutorial是相當好的學習和包括大部分事情需要知道。

Pattern文檔還包含上面教程中缺少的特殊預定義字符類。

您沒有在您給出的例子中指定任何必須規則的東西。如果有規則來驗證輸入,正則表達式纔有意義。

如果它必須完全是"blocka#123#456"那麼"blocka#123#456""^blocka#123#456$"將作爲正則表達式工作。 ^$之間的東西意味着裏面的正則表達式必須從輸入的開始到結束。有時需要,通常是一個好主意,把它放在你的正則表達式中。

如果blocka是動態與[a-z]+替換它通過z具有至少1長度相匹配的小寫字母a任何序列。block[a-z]將匹配blocka,blockb等。 和[a-z]{6}將匹配正好6個字母的任何序列。 [a-zA-Z]也包括大寫字母,並且\p{L}匹配包括unicode內容的任何字母(例如Blüc本)。

#匹配#。像任何沒有特殊正則表達式的字符(\^$ . | ? * + () [ ] { })字符匹配自己。 [^#]匹配每個字符,但是#

關於數字:[0-9]+\d+是幾個數字的通用模式,[0-9]{1,4}將匹配任何東西,包括了1-4的數字像00759999。例如(?:0|[1-9][0-9]{0,3})只會匹配09999之間的數字,並且不允許前導零。 (?:STUFF)是一個非捕獲組,不影響您可以通過Matcher#group(1..?)提取的組。用於邏輯分組|(?:0|[1-9][0-9]{0,3})的含義是:或者是單個0或(1x 1-9-0,03-0 0-9)。

[0-9]是如此普遍以至於它有一個預定義:\d(數字)。這是\\d裏面的正則表達式String因爲你必須逃過\

所以你的一些選項

  • ".*"這絕對一切
  • "^[^#]+(?:#[^#]+)+$"它匹配的任何東西#"hello #world!1# -12.f #本#foo#bar"
  • "^blocka(#\\d+)+$"相匹配,然後在至少一組由分隔的數字blocka分離匹配#例如blocka#1#12#0007#949432149#3
  • "^blocka#(?:[0-9]|[1-9][0-9]|[1-3][0-9]{2})#[4-9][0-9]{2}$"如果發現blocka#後面數字0,這將只匹配 - 399,隨後#最後數400-999
  • "^blocka#123#456$"只匹配正是字符串。

所有這些都是與您給出的示例匹配的正則表達式。

但它可能是因爲

public void Store_QR(String qr){ 
    if(qr.matches("^blocka#\\d+#\\d+$")) { 
     CurrentLocation = qr; 
    } 
    else // Break the operation 
} 

private static final Pattern QR_PATTERN = Pattern.compile("^blocka#(\\d+)#(\\d+)$"); 
public void Store_QR(String qr){ 
    Matcher matcher = QR_PATTERN.matcher(qr); 
    if(matcher.matches()) { 
     int number1 = Integer.valueOf(matcher.group(1)); 
     int number2 = Integer.valueOf(matcher.group(2)); 
     CurrentLocation = qr; 
    } 
    else // Break the operation 
} 

塊名稱#start_X#start_Y任何塊的名字一樣簡單..開始以字符串「塊」,後兩個整數

我想一個很好的正則表達式,這將是"^block\\w+#\\d+#\\d+$",從"block",那麼a任意組合 - zA - Z0 - 9_ (即\w)後面跟着#,數字,#,數字。

將匹配block_#0#0blockZ#9#9block_a_Unicorn666#0000#1234,但不block#1#2因爲根本沒有名稱,將不匹配blockName#123#abc因爲字母而不是數字。也將不匹配Block_a#123#456因爲大寫字母B.

。如果名稱部分(\\w+)是過於寬鬆(____123將是一個合法的名稱),例如使用"^block_?[a-zA-Z]+#\\d+#\\d+$",什麼不允許數字和名字只能被一個可選的_分開,並且之後必須有字母。將允許_a,a,_ABc,但不允許_,​​,_a9。如果您想允許名稱中的數字[a-zA-Z0-9]將是要使用的字符類。

+0

我想要的是檢查它是否是這樣的字符串 BlockName#start_X#start_Y 任何塊名稱..以字符串「block」開頭,後面跟兩個整數..我使用哈希符號收集三個參數..謝謝你的回覆:)意味着很多! – Ruby

+0

blockname可以是block_a,block_b,block_c同樣.. – Ruby

+0

@Ruby我已經添加了一些建議。隨意改善您的需求:) – zapl

3

這取決於你想匹配的內容。

  1. 這裏有一些正則表達式的命題:

    ^blocka#[0-9]{3}#[0-9]{3}$ 
    ^blocka#[0-9]+#[0-9]+$ 
    ^blocka(#[0-9]{3}){2}$ 
    ^blocka(#[0-9]+){2}$ 
    ^blocka(#[0-9]{3})+$ 
    ^blocka(#[0-9]+)+$ 
    
  2. 否則,只要使用或相似。

5

您指定的信息根本不使用正則表達式。

嘗試從更一般的方式。

如果你真的需要掃描 「BLOCKa中#123#456」,然後使用qr.contains("blocka#123#456");

0

我建議:

[a-z]+#\d+#\d+ 

如果你想捕捉3個部分:

([a-z]+)#(\d+)#(\d+) 

Matcher.group(1, 2 or 3)返回零件

相關問題