我该如何将其写为正则表达式?

“ 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的任何小写字母az序列。block[a-z]将匹配blockablockb等。
并且[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到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-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+$",不允许数字和名称的内容只能由一个可选的_分隔,并且此后必须有字母。允许_aa_ABc,但不允许__a_b_a9。如果要允许名称中的数字[a-zA-Z0-9],将是要使用的字符类。

10-07 15:52