我该如何将其写为正则表达式?
“ 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
}
最佳答案
myregexp.com很高兴进行一些测试。
官方Java Regex Tutorial可以很好地学习,其中包括一个人需要知道的大多数内容。
Pattern文档还包括上面的教程中缺少的精美预定义字符类。
在您给出的示例中,您没有指定必须常规的任何内容。仅当存在用于验证输入的规则时,正则表达式才有意义。
如果必须精确地为"blocka#123#456"
,则"blocka#123#456"
或"^blocka#123#456$"
将用作正则表达式。 ^
和$
之间的填充表示内部的正则表达式必须从输入的开始到结束。有时需要将其放在正则表达式中通常是一个好主意。
如果blocka
是动态的,则将其替换为[a-z]+
以匹配长度至少为1的任何小写字母a
至z
序列。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个数字组成的任何内容,例如007
,5
,9999
。例如,(?:0|[1-9][0-9]{0,3})
仅匹配0
和9999
之间的数字,并且不允许前导零。 (?:STUFF)
是一个非捕获组,不会影响您可以通过Matcher#group(1..?)
提取的组。对于使用|
进行逻辑分组很有用。 (?:0|[1-9][0-9]{0,3})
的含义是:单个0
或(1x 1
-9
后跟0到3 x 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
}
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+$"
,不允许数字和名称的内容只能由一个可选的_
分隔,并且此后必须有字母。允许_a
,a
,_ABc
,但不允许_
,_a_b
,_a9
。如果要允许名称中的数字[a-zA-Z0-9]
,将是要使用的字符类。