Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为字符串构建正则表达式?_Java_Android_Regex - Fatal编程技术网

Java 如何为字符串构建正则表达式?

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; }

如何将其作为正则表达式编写

“区块A#123#456”

我已使用#符号分割数据中的参数 参数为块名、startX坐标、start Y坐标

这是嵌入在我二维码中的数据。因此,当我扫描二维码时,我想检查他们扫描的二维码是否正确。为此,我需要一个用于上述语法的正则表达式

我的方法体

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
    或(1x
    1
    -
    9
    后接0到3x
    0
    -
    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}$”
      只有在找到
      blocka#
      后接数字0-399,后接a
      和最后是数字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
     }