Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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 StringTokenizer-如何忽略字符串中的空格_Java_String - Fatal编程技术网

Java StringTokenizer-如何忽略字符串中的空格

Java StringTokenizer-如何忽略字符串中的空格,java,string,Java,String,我试图在下面的单词列表中使用stringtokenizer String sentence=""Name":"jon" "location":"3333 abc street" "country":"usa"" etc Name:jon location:3333 abc street country:usa 当我使用stringtokenizer并将空格作为分隔符时,如下所示 StringTokenizer tokens=new StringTokenizer(sentence," "

我试图在下面的单词列表中使用stringtokenizer

String sentence=""Name":"jon" "location":"3333 abc street" "country":"usa"" etc
Name:jon

location:3333 abc street

country:usa
当我使用stringtokenizer并将空格作为分隔符时,如下所示

StringTokenizer tokens=new StringTokenizer(sentence," ")
我希望我的输出是不同的标记,如下所示

String sentence=""Name":"jon" "location":"3333 abc street" "country":"usa"" etc
Name:jon

location:3333 abc street

country:usa
但是字符串标记器也尝试对location的值进行标记,它看起来像

Name:jon

location:3333

abc

street

country:usa

请告诉我如何修复上述问题,如果我需要使用正则表达式,我应该指定什么类型的表达式?

您可以使用Json,它看起来就像您使用的是Json类型的模式。 做一点google,并尝试实现Json

String sentence=""Name":"jon" "location":"3333 abc street" "country":"usa"" etc
将是键,类似Json的名称中的值对是键,Jon是值。位置是关键,3333 abc街是价值所在。等等

试试看。 这里有一个链接

编辑: 这只是一个有点傻的答案,但你可以试试这样的, 句子=句子.replaceAll(“\”,“);
StringTokenizer tokens=new StringTokenizer(句子“”);

您可以使用Json,看起来您使用的是Json类型的模式。 做一点google,并尝试实现Json

String sentence=""Name":"jon" "location":"3333 abc street" "country":"usa"" etc
将是键,类似Json的名称中的值对是键,Jon是值。位置是键,3333 abc street是值。依此类推

试试看。 这里有一个链接

编辑: 这只是一个有点傻的答案,但你可以试试这样的, 句子=句子.replaceAll(“\”,“);
StringTokenizer标记=新的StringTokenizer(句子“”)

这可以使用一个

输出:

Scol[0]: [Name:jon]
Scol[1]: [location:3333 abc street]
Scol[2]: [country:usa]
现场演示: 说明:根据OP的意见: 我正在使用这个正则表达式:

(.+?)(\\s+(?=(?:(?:[^\"]*\"){2})*[^\"]*$)|$)
String s = "\"Name\":\"jon\" \"location\":\"3333 abc street\" \"country\":\"usa\"";
Pattern p = Pattern.compile("\"([^\"]*)\"");
Matcher m = p.matcher(s);
while (m.find()) {
    System.out.println(m.group(1));
}
现在把它分解成更小的块

PS:DQ代表双引号

(?:[^\"]*\")                    0 or more non-DQ characters followed by one DQ (RE1)
(?:[^\"]*\"){2}                 Exactly a pair of above RE1
(?:(?:[^\"]*\"){2})*            0 or more occurrences of pair of RE1
(?:(?:[^\"]*\"){2})*[^\"]*$     0 or more occurrences of pair of RE1 followed by 0 or more non-DQ characters followed by end of string (RE2)
(?=(?:(?:[^\"]*\"){2})*[^\"]*$) Positive lookahead of above RE2

.+?  Match 1 or more characters (? is for non-greedy matching)
\\s+ Should be followed by one or more spaces
(\\s+(?=RE2)|$) Should be followed by space or end of string

简言之:表示匹配1个或更多长度的任何字符,后跟“空格或字符串结尾”。空格后面必须跟有偶数个DQ。因此,双引号外的空格将被匹配,而双引号内的空格将不被匹配(因为这些空格后面紧跟着奇数个DQ)。

这可以使用

输出:

Scol[0]: [Name:jon]
Scol[1]: [location:3333 abc street]
Scol[2]: [country:usa]
现场演示: 说明:根据OP的意见: 我正在使用这个正则表达式:

(.+?)(\\s+(?=(?:(?:[^\"]*\"){2})*[^\"]*$)|$)
String s = "\"Name\":\"jon\" \"location\":\"3333 abc street\" \"country\":\"usa\"";
Pattern p = Pattern.compile("\"([^\"]*)\"");
Matcher m = p.matcher(s);
while (m.find()) {
    System.out.println(m.group(1));
}
现在把它分解成更小的块

PS:DQ代表双引号

(?:[^\"]*\")                    0 or more non-DQ characters followed by one DQ (RE1)
(?:[^\"]*\"){2}                 Exactly a pair of above RE1
(?:(?:[^\"]*\"){2})*            0 or more occurrences of pair of RE1
(?:(?:[^\"]*\"){2})*[^\"]*$     0 or more occurrences of pair of RE1 followed by 0 or more non-DQ characters followed by end of string (RE2)
(?=(?:(?:[^\"]*\"){2})*[^\"]*$) Positive lookahead of above RE2

.+?  Match 1 or more characters (? is for non-greedy matching)
\\s+ Should be followed by one or more spaces
(\\s+(?=RE2)|$) Should be followed by space or end of string

简言之:表示匹配1个或更多长度的任何字符,后跟“空格或字符串结尾”。空格后面必须跟有偶数个DQ。因此,双引号外的空格将被匹配,而双引号内的空格将不被匹配(因为后面紧跟着奇数个DQ)。

StringTokenizer对于这项工作来说太简单了。如果不需要处理值中的引号,可以尝试以下正则表达式:

(.+?)(\\s+(?=(?:(?:[^\"]*\"){2})*[^\"]*$)|$)
String s = "\"Name\":\"jon\" \"location\":\"3333 abc street\" \"country\":\"usa\"";
Pattern p = Pattern.compile("\"([^\"]*)\"");
Matcher m = p.matcher(s);
while (m.find()) {
    System.out.println(m.group(1));
}
输出:

名称
乔恩
位置
abc街3333号
国家
美国

这不会处理输出值内的内部引号,例如

姓名:弗雷德(“弗雷迪”)琼斯


StringTokenizer对于这项工作来说太简单了。如果不需要处理值中的引号,可以尝试以下正则表达式:

(.+?)(\\s+(?=(?:(?:[^\"]*\"){2})*[^\"]*$)|$)
String s = "\"Name\":\"jon\" \"location\":\"3333 abc street\" \"country\":\"usa\"";
Pattern p = Pattern.compile("\"([^\"]*)\"");
Matcher m = p.matcher(s);
while (m.find()) {
    System.out.println(m.group(1));
}
输出:

名称
乔恩
位置
abc街3333号
国家
美国

这不会处理输出值内的内部引号,例如

姓名:弗雷德(“弗雷迪”)琼斯


StringTokenizer
对于这项工作来说太简单了。考虑使用正则表达式或进行自己的解析。您是否需要处理值本身内部的引号?我将在输出文件中使用带有值的引号,而不进行任何处理,例如位置:“333 abc street”我指的是值内部的引号,而不是它们周围的引号(例如,
Name:Fred(“Freddy”)琼斯< /代码>很明显,他们必须设法逃脱。<代码> StruttoKeisher 对于这项工作来说太简单了。考虑使用正则表达式或自己的解析。是否需要处理值本身中的引号?我将在输出文件中使用带有引用值的引用标记,而不使用任何PRO。转让,即位置:“333 abc street”我指的是价值观中的引号,而不是在价值观周围的引号(例如,
Name:Fred(“Freddy”)Jones
。显然,它们必须以某种方式进行转义。如果整件事的元素和大括号之间有逗号,那就是JSON。我不想使用JSON库,因为文本的格式不完全是JSON格式。如果整件事的元素和大括号之间有逗号,那就是JSON。我不想使用JSON库因为文本不完全是JSON格式。您真的希望在输出中嵌入null吗?最好是
替换(“\”,“”)
@anubhava您能详细解释模式匹配解决方案吗?尤其是模式。+1用于解决方案。@Raghunandan:当然,我会在几分钟后将解释添加到我的答案中。您真的希望输出中嵌入空值吗?最好用
替换(“\”,”)
@anubhava你能详细解释模式匹配解决方案吗?特别是模式。@Raghunandan:当然,我会在几分钟内把解释添加到我的答案中。