Java 如何为字符串构建正则表达式?
如何将其作为正则表达式编写 “区块A#123#456” 我已使用#符号分割数据中的参数 参数为块名、startX坐标、start Y坐标 这是嵌入在我二维码中的数据。因此,当我扫描二维码时,我想检查他们扫描的二维码是否正确。为此,我需要一个用于上述语法的正则表达式 我的方法体Java 如何为字符串构建正则表达式?,java,android,regex,Java,Android,Regex,如何将其作为正则表达式编写 “区块A#123#456” 我已使用#符号分割数据中的参数 参数为块名、startX坐标、start Y坐标 这是嵌入在我二维码中的数据。因此,当我扫描二维码时,我想检查他们扫描的二维码是否正确。为此,我需要一个用于上述语法的正则表达式 我的方法体 public void Store_QR(String qr){ if( qr.matches(regular Expression here)) { CurrentLocation = qr; }
public void Store_QR(String qr){
if( qr.matches(regular Expression here)) {
CurrentLocation = qr;
}
else // Break the operation
}
这取决于你想匹配什么
^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()
或类似工具即可您指定的信息根本不适合使用正则表达式 试着用一种更普遍的方式来理解它 如果你真的需要扫描“blocka 123 456”,那么使用
qr.contains(“blocka 123 456”)代码>我建议:
[a-z]+#\d+#\d+
如果您想捕获这三个部分:
([a-z]+)#(\d+)#(\d+)
Matcher.group(1、2或3)
返回部分很好地进行了一些测试
官方是很好的学习和包括大多数事情一个人需要知道
该文档还包括上述教程中缺少的高级预定义字符类
在您给出的示例中,您没有指定任何必须是常规的内容。只有当有规则验证输入时,正则表达式才有意义
如果必须精确地使用“blocka#123#456”
,则“blocka#123#456”
或“^blocka#123#456$”
将作为正则表达式使用。^
和$
之间的填充意味着内部的正则表达式必须从输入的开始到结束。有时需要,通常是一个好主意,把它放在你的正则表达式
如果blocka
是动态的,则将其替换为[a-z]+
,以匹配长度至少为1的任何小写字母序列a
到z
<代码>块[a-z]
将匹配块a
,块B
,等等。
而[a-z]{6}
将匹配任何正好由6个字母组成的序列[a-zA-Z]
还包括大写字母,并且\p{L}
匹配任何包含unicode内容的字母(例如Blüc本代码>)
#
匹配#
。与任何没有特殊正则表达式含义的字符一样(\^$.|?*+()[]{}
)字符本身匹配<代码>[^#]
匹配每个字符,但
除外
关于数字:[0-9]+
或\d+
是几个数字的通用模式,[0-9]{1,4}
将匹配由1-4个数字组成的任何内容,如007
,5
,9999
<例如,code>(?:0 |[1-9][0-9]{0,3})将只匹配0
和9999
之间的数字,并且不允许前导零(?:STUFF)
是一个非捕获组,不影响通过Matcher\group(1..?)
提取的组。用于使用|
进行逻辑分组。(?:0 |[1-9][0-9]{0,3})
的含义是:单个0
或(1x1
-9
后接0到3x0
-9
)
[0-9]
非常常见,因此它有一个预定义:\d
(数字)。它位于正则表达式\\d
字符串中,因为您必须转义\
所以你的一些选择是
完全匹配所有内容“*”
匹配任何由“^[^#]+(?:#[^#]+$”
分隔的内容,如#
“你好#世界!1#-12.f#本#foo#bar“
匹配“^blocka(#\\d++++$”
,后跟至少一组由blocka
分隔的数字,例如blocka 1#12#0007#94949432149#3
只有在找到“^blocka#”(?:[0-9]|[1-9][0-9]|[1-3][0-9]{2}){4-9][0-9]{2}$”
后接数字0-399,后接ablocka#
和最后是数字400-999时才会匹配
,它仅与该字符串完全匹配“^blocka#123#456$”
public void Store_QR(String qr){
if( qr.matches("^blocka#\\d+#\\d+$")) {
CurrentLocation = qr;
}
else // Break the operation
}
或
块名#开始#开始#任何块名。。从字符串“block”开始,后跟两个整数 我想一个好的正则表达式应该是
“^block\\w+\\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
,因为字母而不是数字。也不会匹配块a#123#456
,因为大写字母为B
如果名称部分(\\w+/code>)过于自由(\uuuuuuuuuuuuuuu
,\u123
将是一个合法的名称)使用,例如,“^block_uuuuuu”[a-zA-Z]+\d+$”
,不允许使用数字和名称的部分只能用一个可选的\uuuuuuuuuuuuuuuuuuuuuuuuz>,之后必须有字母。将允许\u a
,a
,\u ABc
,但不允许\u a\u b
,\u a9
。如果您想在名称中使用数字[a-zA-Z0-9]
将是要使用的字符类。您的二维码的确切模式是什么,您可以举出更多的例子吗?请详细解释您想要匹配的具体模式。例如,什么是#,它们代表任何数字或文字字符#,是文字字符串“blocka”的“blocka”部分还是6个字符长的文本示例。回答这些问题将使注册
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
}