Java StringTokenizer-如何忽略字符串中的空格
我试图在下面的单词列表中使用stringtokenizerJava 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," "
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:当然,我会在几分钟内把解释添加到我的答案中。