Java标记器,分隔字符串
我不知道为什么我会在这件事上苦苦挣扎,但如果能得到任何帮助,我将不胜感激 我正在创建自己的标记器,它接收一个包含命令、分隔符和值列表的文件。然后,它输出每个“令牌”及其类型 输入:Java标记器,分隔字符串,java,stringtokenizer,Java,Stringtokenizer,我不知道为什么我会在这件事上苦苦挣扎,但如果能得到任何帮助,我将不胜感激 我正在创建自己的标记器,它接收一个包含命令、分隔符和值列表的文件。然后,它输出每个“令牌”及其类型 输入:和3,4,5;一些评论 我需要输出: AND --- command 3 --- value , --- delimiter 4 --- value , --- delimiter 5 --- value 我现在正在将其输出到我正在输出的位置: AND 3, 4, 5 --- delimiter 但我需要进一步细分
和3,4,5;一些评论
我需要输出:
AND --- command
3 --- value
, --- delimiter
4 --- value
, --- delimiter
5 --- value
我现在正在将其输出到我正在输出的位置:
AND 3, 4, 5 --- delimiter
但我需要进一步细分
以下是我目前的情况:
ArrayList<Token> tokenize(String[] input) {
ArrayList<Token> tokens = new ArrayList<Token>();
for (String str : input) {
Token token = new Token(str.trim());
//Check if int
try{
Integer.parseInt(str);
token.type = "number";
} catch(NumberFormatException e) {
}
if (token.type == null) {
if (commands.contains(str))
token.type = "command";
else if (str.contains(",")) {
token.type = "delimiter";
} else if (destValues.contains(str))
token.type = "destination";
else
token.type = "unknown";
}
if(! token.type.equals("unknown"))
tokens.add(token);
}
return tokens;
}
ArrayList标记化(字符串[]输入){
ArrayList标记=新的ArrayList();
for(字符串str:input){
Token Token=新标记(str.trim());
//检查是否为int
试一试{
整数.parseInt(str);
token.type=“编号”;
}捕获(数字格式){
}
if(token.type==null){
if(commands.contains(str))
token.type=“command”;
else if(str.contains(“,”)){
token.type=“delimiter”;
}else if(destValues.contains(str))
token.type=“目的地”;
其他的
token.type=“未知”;
}
如果(!token.type.equals(“未知”))
令牌。添加(令牌);
}
归还代币;
}
我对这个赋值的唯一真正限制是不能使用StringTokenizer和regex。似乎您的输入不正确。尝试此操作以拆分输入,然后使用标记化方法
import java.util.*;
public class Foo {
public static void main( String[] args ) {
String input = "AND 3, 4, 5 ; some comments";
List<String> parts = new ArrayList<String>();
// removing comments
input = input.split( ";" )[0];
// splits using spaces
String[] firstPass = input.trim().split( " " );
for ( String s : firstPass ) {
// the current part cannot be empty
if ( !s.trim().isEmpty() ) {
// splits using comma
String[] secondPass = s.split( "," );
for ( String ss : secondPass ) {
parts.add( ss.replace( ",", "" ) );
}
// verifies if the current part has a comma
// and if so, inserts it as a part
if ( s.contains( "," ) ) {
parts.add( "," );
}
}
}
for ( String a : parts ) {
System.out.println( a );
}
}
}
import java.util.*;
公开课Foo{
公共静态void main(字符串[]args){
String input=“和3、4、5;一些注释”;
列表部件=新的ArrayList();
//删除评论
input=input.split(“;”)[0];
//使用空格拆分
字符串[]firstPass=input.trim().split(“”);
for(字符串s:firstPass){
//当前部分不能为空
如果(!s.trim().isEmpty()){
//使用逗号拆分
字符串[]secondPass=s.split(“,”);
for(字符串ss:secondPass){
零件。添加(不锈钢替换(“,”,”);
}
//验证当前零件是否有逗号
//如果是,则将其作为一部分插入
如果(s)包含(“,”){
添加(“,”);
}
}
}
用于(字符串a:零件){
系统输出打印项次(a);
}
}
}
编辑:在我的第一个答案工作时,这里有一个包含一些重构的完整示例…
import java.util.*;
public class MyTinyParser {
private static final String COMMANDS = "AND OR FOO BAR";
private List<String> extract( String input ) {
List<String> parts = new ArrayList<String>();
// removing comments
input = input.split( ";" )[0];
// splits using spaces
String[] firstPass = input.trim().split( " " );
for ( String s : firstPass ) {
// the current part cannot be empty
if ( !s.trim().isEmpty() ) {
// splits using comma
String[] secondPass = s.split( "," );
for ( String ss : secondPass ) {
parts.add( ss.replace( ",", "" ) );
}
// verifies if the current part has a comma
// and if so, inserts it as a part
if ( s.contains( "," ) ) {
parts.add( "," );
}
}
}
return parts;
}
public List<Token> tokenize( String input ) {
List<Token> tokens = new ArrayList<Token>();
for ( String str : extract( input ) ) {
Token token = new Token( str );
// check if int
try{
Integer.parseInt( str );
token.type = "number";
} catch(NumberFormatException e) {
}
if ( token.type == null ) {
if ( COMMANDS.contains(str)){
token.type = "command";
} else if (str.contains(",")) {
token.type = "delimiter";
} else {
token.type = "unknown";
}
}
if( !token.type.equals( "unknown" ) ) {
tokens.add( token );
}
}
return tokens;
}
private class Token {
String value;
String type;
Token( String value ) {
this.value = value;
}
@Override
public String toString() {
return String.format( "Token[%s, %s]", value, type );
}
}
public static void main( String[] args ) {
MyTinyParser mtp = new MyTinyParser();
List<Token> tokens = mtp.tokenize( "AND 3, 4, 5 ; some comments" );
for ( Token t : tokens ) {
System.out.println( t );
}
}
}
import java.util.*;
公共类MyTinyParser{
private static final String COMMANDS=“和或FOO-BAR”;
私有列表提取(字符串输入){
列表部件=新的ArrayList();
//删除评论
input=input.split(“;”)[0];
//使用空格拆分
字符串[]firstPass=input.trim().split(“”);
for(字符串s:firstPass){
//当前部分不能为空
如果(!s.trim().isEmpty()){
//使用逗号拆分
字符串[]secondPass=s.split(“,”);
for(字符串ss:secondPass){
零件。添加(不锈钢替换(“,”,”);
}
//验证当前零件是否有逗号
//如果是,则将其作为一部分插入
如果(s)包含(“,”){
添加(“,”);
}
}
}
返回部件;
}
公共列表标记化(字符串输入){
List tokens=newarrayList();
for(字符串str:extract(输入)){
令牌=新令牌(str);
//检查是否为int
试一试{
整数.parseInt(str);
token.type=“编号”;
}捕获(数字格式){
}
if(token.type==null){
if(COMMANDS.contains(str)){
token.type=“command”;
}else if(str.contains(“,”)){
token.type=“delimiter”;
}否则{
token.type=“未知”;
}
}
如果(!token.type.equals(“未知”)){
令牌。添加(令牌);
}
}
归还代币;
}
私有类令牌{
字符串值;
字符串类型;
令牌(字符串值){
这个值=值;
}
@凌驾
公共字符串toString(){
返回String.format(“令牌[%s,%s]”,值,类型);
}
}
公共静态void main(字符串[]args){
MyTinyParser mtp=新的MyTinyParser();
List tokens=mtp.tokenize(“和3,4,5;一些注释”);
for(令牌t:令牌){
系统输出打印ln(t);
}
}
}
如果允许您使用谷歌的api,您也可以尝试以下类似的方法
import com.google.common.base.Splitter;
public class Tmp {
public static void main(String[] args) {
String str = "AND 3, 4, 5 ; some comments";
Iterable<String> stringIterable = Splitter.on(' ').trimResults()
.omitEmptyStrings()
.split(str);
for (String str1 : stringIterable) {
int commaIndex = str1.indexOf(",");
if (commaIndex > 0) {
System.out.println(str1.subSequence(0, commaIndex));
System.out.println(",");
} else {
System.out.println(str1);
}
}
}
}
附言不是最好的代码。它还可以进一步改进,大家可以随意插话。您可以使用String.split()还是需要手动标记字符串?我可以使用split(),但是我如何拆分它以去除空格,但保留逗号?您的输入是否已经被拆分成部分?你想改进什么?我正在写一些代码。。。请稍等。@btjordan23不客气!我正在改进我的例子。。。稍等片刻
AND
3
,
4
,
5
;
some
comments