[英]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");
這取決於您要匹配的內容。
以下是一些正則表達式命題:
^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]+)+$
否則,只需使用contains()
或類似方法。
myregexp.com很高興進行一些測試。
正式的Java Regex教程非常好學習,其中包括一個需要了解的大多數內容。
模式文檔還包括上述教程中缺少的精美預定義字符類。
在您給出的示例中,您沒有指定必須常規的任何內容。 僅當存在用於驗證輸入的規則時,正則表達式才有意義。
如果必須恰好是"blocka#123#456"
則"blocka#123#456"
或"^blocka#123#456$"
將用作正則表達式。 ^
和$
之間的填充表示內部的正則表達式必須從輸入的開始到結束。 有時需要,並且通常是將其放在正則表達式中的一個好主意。
如果blocka
是動態的,則將其替換為[az]+
以匹配長度至少為1的任何小寫字母a
至z
序列blocka
block[az]
將匹配blocka
, blockb
等。而[az]{6}
將匹配任何正好6個字母的順序。 [a-zA-Z]
還包含大寫字母, \\p{L}
匹配任何包含unicode內容的字母(例如Blüc本
)。
#
符合#
。 就像任何沒有特殊正則表達式含義的字符( \\ ^ $ . | ? * + ( ) [ ] { }
)一樣,它們自己匹配。 [^#]
匹配除#
所有字符。
關於數字: [0-9]+
或\\d+
是一個通用的圖案為多個號碼, [0-9]{1,4}
將匹配任何由出1-4號的像007
, 5
, 9999
。 (?:0|[1-9][0-9]{0,3})
將僅匹配0
到9999
之間的數字,並且不允許前導零。 (?: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
- z
, A
- Z
, 0
- 9
和_
(多數民眾贊成在\\w
)后跟#
,數字, #
,數字。
將匹配block_#0#0
, blockZ#9#9
, block_a_Unicorn666#0000#1234
,但不匹配block#1#2
因為根本沒有名稱,並且不會匹配blockName#123#abc
因為字母而不是數字。 由於大寫字母B,也不會與Block_a#123#456
匹配。
如果名稱部分( \\\\w+
)太寬泛( ___
, _123
將是合法名稱),請使用例如"^block_?[a-zA-Z]+#\\\\d+#\\\\d+$"
,那會怎樣? t允許數字和名稱只能用一個可選的_
分隔,此后必須有字母。 允許_a
, a
, _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.