Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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_String_Split_Special Characters - Fatal编程技术网

如何在Java中拆分带有特殊字符`}`、`/`、`-`和`{`的字符串

如何在Java中拆分带有特殊字符`}`、`/`、`-`和`{`的字符串,java,string,split,special-characters,Java,String,Split,Special Characters,我一直在沿着这条线索走,并取得了成功 但是在当前用例中,我正在处理的字符串包含特殊字符 我有一个字符串作为https://{domain name}/{type of data}/4583236-{name of increator},我想从中提取4583236 QA或多或少与我前面提到的问题相关,但在我的用例中没有帮助 我的程序在任意一个特殊字符上随机抛出模式SyntaxException:非法重复 代码块: String current_url = "https://{domain

我一直在沿着这条线索走,并取得了成功

但是在当前用例中,我正在处理的
字符串包含特殊字符

我有一个
字符串
作为
https://{domain name}/{type of data}/4583236-{name of increator}
,我想从中提取
4583236

QA或多或少与我前面提到的问题相关,但在我的用例中没有帮助

我的程序在任意一个特殊字符上随机抛出模式SyntaxException:非法重复

代码块:

    String current_url = "https://{domain name}/{type of data}/4583236-{name-of-perpetrators}";
    String[] urlParts = current_url.split("type of data}/");
    String mySuburl = urlParts[1];
    String[] suburl = mySuburl.split("-{name-of-perpetrators");
    String mytext = suburl[0];
    System.out.println(mytext);
错误堆栈跟踪:

Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal repetition
{name-of-perpetrators
    at java.util.regex.Pattern.error(Unknown Source)
    at java.util.regex.Pattern.closure(Unknown Source)
    at java.util.regex.Pattern.sequence(Unknown Source)
    at java.util.regex.Pattern.expr(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.util.regex.Pattern.<init>(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.lang.String.split(Unknown Source)
    at java.lang.String.split(Unknown Source)
    at demo.TextSplit.main(TextSplit.java:18)
线程“main”java.util.regex.PatternSyntaxException中的异常:非法重复 {肇事者姓名 位于java.util.regex.Pattern.error(未知源) 位于java.util.regex.Pattern.closure(未知源) 位于java.util.regex.Pattern.sequence(未知源) 位于java.util.regex.Pattern.expr(未知源) 位于java.util.regex.Pattern.compile(未知源代码) 位于java.util.regex.Pattern。(未知源) 位于java.util.regex.Pattern.compile(未知源代码) 位于java.lang.String.split(未知源) 位于java.lang.String.split(未知源) 在demo.textspilt.main(textspilt.java:18)
的参数是正则表达式。因此,您需要转义正则表达式中使用的特殊字符,例如
{
{}
用于表示正则表达式中的重复,因此错误
非法重复

String[] suburl = mySuburl.split("-\\{name-of-perpetrators");
如果不希望
split
的参数是正则表达式,请使用以避免按建议转义

String[] suburl = mySuburl.split(Pattern.quote("-{name-of-perpetrators"));
的参数是正则表达式。因此,您需要转义正则表达式中使用的特殊字符,例如
{
{}
用于表示正则表达式中的重复,因此错误
非法重复

String[] suburl = mySuburl.split("-\\{name-of-perpetrators");
如果不希望
split
的参数是正则表达式,请使用以避免按建议转义

String[] suburl = mySuburl.split(Pattern.quote("-{name-of-perpetrators"));
尝试使用以避免逐个字符转义,它将免费为您执行此操作:

String[] suburl = mySuburl.split(Pattern.quote("-{name-of-perpetrators"));
尝试使用以避免逐个字符转义,它将免费为您执行此操作:

String[] suburl = mySuburl.split(Pattern.quote("-{name-of-perpetrators"));

对于查找另一个字符串中包含的文本字符串这样简单的事情,没有理由使用像正则表达式模式这样复杂的东西

使用
indexOf
substring
就足够了:

String text = "https://{domain name}/{type of data}/4583236-{name-of-perpetrators}";
String searchStart = "{type of data}/";
String searchEnd = "-{name-of-perpetrators}";
int start = text.indexOf(searchStart) + searchStart.length();
int end = text.indexOf(searchEnd, start);

String expected = "4583236";
assertEquals(expected, text.substring(start, end));

显然,如果在任何时候输入的文本可能都不是这种格式,那么这种方法可能会失败,例如将
start
end
变量设置为负值。如果是这种情况,您应该检查并适当地处理它。

没有理由使用像正则表达式p这样复杂的东西尝试查找包含在另一个字符串中的文本字符串这样简单的内容

使用
indexOf
substring
就足够了:

String text = "https://{domain name}/{type of data}/4583236-{name-of-perpetrators}";
String searchStart = "{type of data}/";
String searchEnd = "-{name-of-perpetrators}";
int start = text.indexOf(searchStart) + searchStart.length();
int end = text.indexOf(searchEnd, start);

String expected = "4583236";
assertEquals(expected, text.substring(start, end));

显然,如果在任何时候输入的文本可能都不完全是这种格式,那么这种方法可能会失败,例如将
开始
结束
变量设置为负值。如果是这种情况,您应该检查它并进行适当处理。

为什么不在“/”上拆分,然后选择正确的起始点。您可以这样做(更多)很容易提取数值。@Stultuske感谢你的建议。但是用
/
&
-
拆分不会打印任何东西。实际上你不需要拆分多次。两个
索引
子字符串
更好,可能更有效。@M.Prokhorov我漏掉了你的建议。你能给我举个例子?为什么不在“/”上拆分,然后选择正确的起始点。在那里你可以(更多)很容易提取数值。@Stultuske感谢你的建议。但是用
/
&
-
拆分不会打印任何东西。实际上你不需要拆分多次。两个
索引
子字符串
更好,可能更有效。@M.Prokhorov我漏掉了你的建议。你能给我举个例子?
split(“-\{肇事者姓名”);
非常完美!!!非常感谢你的漂亮解释。
split(“-\{肇事者姓名”);
非常完美!!!非常感谢你的漂亮解释。
Pattern.quote(“-{肇事者姓名”)
看起来很出色!!!非常感谢。
Pattern.quote(“-{肇事者姓名”)
似乎很出色!!!非常感谢。毫无疑问,这是个好主意。但我不知道期望值到底是多少。因此我的问题是如何提取数字。我不清楚你在问什么。使用索引调用
子字符串可以从初始文本中提取正确的数字,如测试Wha所示你还不想知道吗?如何将
字符串
转换为数字?谢谢。这是个好主意,毫无疑问。但我不知道期望值到底是什么。因此我的问题是如何提取数字。我不清楚你在问什么。使用索引调用
子字符串
可以从initia中提取正确的数字l文本,如测试所示,您还想知道什么?如何将
String
转换为数字?