Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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_Regex_Replace - Fatal编程技术网

Java正则表达式-字符串结束前的特殊字符

Java正则表达式-字符串结束前的特殊字符,java,regex,replace,Java,Regex,Replace,给定的字符串规则是 [Random Nr of Letters]##[Random Nr of Letters]#[Random Nr of Letters]########## 字符串长度必须为35 我的绳子看起来像 TEST##TESTING#TEST################# 我的问题是我无法检测出错误的格式,比如 TEST##TESTING#TEST##A############## 我的方法是: private static boolean test(String tes

给定的字符串规则是

[Random Nr of Letters]##[Random Nr of Letters]#[Random Nr of Letters]##########
字符串长度必须为35

我的绳子看起来像

TEST##TESTING#TEST#################
我的问题是我无法检测出错误的格式,比如

TEST##TESTING#TEST##A##############
我的方法是:

private static boolean test(String test_line) {
    String test = "[A-Z]{1,}##[A-Z]{1,}#[A-Z]{1,}#{1,}";
    Pattern test_pattern = Pattern.compile(test);
    Matcher matcher = test_pattern.matcher(test_line);
    return matcher.find();
}
是否有一个简单的正则表达式方法(我必须使用它),比如“用#结束这个字符串,并且不允许使用其他字符”

另一个问题: 我如何确保我的测试不允许使用A-Z 0-9和#以外的其他字符?比如:

    String test = "([^A-Z][^0-9][#])";
    Pattern test_pattern = Pattern.compile(test);
    Matcher matcher = test_pattern.matcher(test_line);
    return matcher.find();
(与谈判)

谢谢你的帮助:)

试试这个

[a-zA-Z]+#{2}[a-zA-Z]+#{1}[a-zA-Z]+#{1,}


下面的正则表达式将匹配满足上述标准的行

^(?=.{35}$)[A-Z0-9]+##[A-Z0-9]+#[A-Z0-9]+#+$


它与正好包含35个字符的行匹配。

对于指定的格式,确保最后一个字符是
\

要测试字符串的长度,请执行以下操作:

if(test.length == 35)
    // ...
要测试并允许数字(仅字母数字和
#
符号):

要同时允许小写字母,请执行以下操作:

(\w+#+){3}

让我们一步一步来:

为了确保某些字符串具有特定的长度,正则表达式可以如下所示

^.{35}$
^[A-Z#]{35}$
^(?=[A-Z#]{35}$)[A-Z]+##[A-Z]+#[A-Z]+#+$
    ----------- ------------------------
regex1 (length)  regex2 (order)
在哪里

  • ^
    表示字符串的开头
  • 表示任何字符(除行分隔符外)
  • {35}
    表示前一个元素(在本例中为
    -任何字符)可以出现的次数,因此这里regex需要35个字符
  • $
    表示字符串的结尾
在您的情况下,您希望只接受范围
A-Z
#
中的字符,这样您就可以用这个
[A-Z#]
替换
(任何字符),这样您的正则表达式看起来就像

^.{35}$
^[A-Z#]{35}$
^(?=[A-Z#]{35}$)[A-Z]+##[A-Z]+#[A-Z]+#+$
    ----------- ------------------------
regex1 (length)  regex2 (order)
但您还需要确保这些字符的顺序。换句话说,您还需要检查整个字符串是否与其他正则表达式匹配

^[A-Z]{1,}##[A-Z]{1,}#[A-Z]{1,}#{1,}$
实际上,我们可以简单地使用
+
而不是
{1,}
,这将为我们提供

^[A-Z]+##[A-Z]+#[A-Z]+#+$
要组合这两个正则表达式,您可以使用一种机制,让我们可以查看使用它的位置之后的字符,并检查它之后的字符是否与其他正则表达式匹配

所以最后的正则表达式看起来像

^.{35}$
^[A-Z#]{35}$
^(?=[A-Z#]{35}$)[A-Z]+##[A-Z]+#[A-Z]+#+$
    ----------- ------------------------
regex1 (length)  regex2 (order)

现在,为了避免重新编译(
Pattern.compile(test)
),每次调用方法时都要使用相同的正则表达式,最好将其编译后的版本作为类字段存储在方法之外。所以试试类似的东西

private static Pattern test_pattern = Pattern
        .compile("^(?=[A-Z#]{35}$)[A-Z]+##[A-Z]+#[A-Z]+#+$");

private static boolean test(String test_line) {
    return test_pattern.matcher(test_line).matches();
}
试验


你的意思是?
{1,}
相当于
+
@nickb谢谢,我知道:)只是想保持不变structure@hex494D49输入长度必须为35个字符。@AvinashRaj谢谢你,你可以看到OP每十秒钟编辑一次问题;)
{1,}
相当于
+
@AvinashRaj+1,因为您的评论在我回答之前几秒钟;)