簡體   English   中英

如何為字符串構建正則表達式?

[英]How to build a regular expression for a string?

我該如何將其寫為正則表達式?

“ blocka#123#456”

我已經使用#符號來分割數據中的參數,並且這些參數是塊名稱,startX坐標,start Y坐標

這是嵌入在我的QR碼中的數據。因此,當我掃描QR時,我想檢查其是否正在掃描正確的QR。 為此,我需要上述語法的正則表達式。

我的方法體

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

您指定的信息完全不能使用正則表達式來說明。

嘗試以更一般的方式擺脫它。

如果您確實需要掃描“ blocka#123#456”,請使用qr.contains("blocka#123#456");

這取決於您要匹配的內容。

  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. 否則,只需使用contains()或類似方法。

myregexp.com很高興進行一些測試。

正式的Java Regex教程非常好學習,其中包括一個需要了解的大多數內容。

模式文檔還包括上述教程中缺少的精美預定義字符類。

在您給出的示例中,您沒有指定必須常規的任何內容。 僅當存在用於驗證輸入的規則時,正則表達式才有意義。

如果必須恰好是"blocka#123#456""blocka#123#456""^blocka#123#456$"將用作正則表達式。 ^$之間的填充表示內部的正則表達式必須從輸入的開始到結束。 有時需要,並且通常是將其放在正則表達式中的一個好主意。

如果blocka是動態的,則將其替換為[az]+以匹配長度至少為1的任何小寫字母az序列blocka block[az]將匹配blockablockb等。而[az]{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..?)提取的Matcher#group(1..?) |進行邏輯分組很有用 的含義(?:0|[1-9][0-9]{0,3})是:一個單一的0 OR(1× 1 - 9后跟0至3× 0 - 9 )。

[0-9]非常常見,因此有一個預定義: \\d (數字)。 它在正則表達式String \\\\d ,因為您必須轉義\\

所以您的一些選擇是

  • ".*"絕對匹配所有內容
  • "^[^#]+(?:#[^#]+)+$"與由#分隔的任何內容匹配,例如"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#后跟數字blocka# ,再跟#和最后是數字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
 }

BlockName#start_X#start_Y任何塊名..以字符串“ block”開頭,后跟兩個整數

我想一個良好的正則表達式,這將是"^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因為字母而不是數字。 由於大寫字母B,也不會與Block_a#123#456匹配。

如果名稱部分( \\\\w+ )太寬泛( ____123將是合法名稱),請使用例如"^block_?[a-zA-Z]+#\\\\d+#\\\\d+$" ,那會怎樣? t允許數字和名稱只能用一個可選的_分隔,此后必須有字母。 允許_aa_ABc ,但不允許__ _a_b_a9 如果要允許名稱中的數字[a-zA-Z0-9]是要使用的字符類。

我建議:

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

如果要捕獲這三個部分:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM