在Java中分解字符串

在Java中分解字符串,java,string,Java,String,我有以下格式的多个字符串: 2009年12月18日02:08:26 Doe,John(Card#111)在南大厅被接纳[在] 从这些字符串中,我需要得到日期、时间、此人的名字和姓氏以及卡号。“允许”一词可以省略,卡号最后一位后面的任何内容都可以忽略。 我有一种感觉,我想使用StringTokenizer来实现这一点,但我不确定 有什么建议吗?相信你的勇气……:) 使用StringTokenizer:import java.io.*; import java.io.*; import java.

我有以下格式的多个字符串:
2009年12月18日02:08:26 Doe,John(Card#111)在南大厅被接纳[在]

从这些字符串中,我需要得到日期、时间、此人的名字和姓氏以及卡号。“允许”一词可以省略,卡号最后一位后面的任何内容都可以忽略。
我有一种感觉,我想使用StringTokenizer来实现这一点,但我不确定
有什么建议吗?

相信你的勇气……:) 使用StringTokenizer:
import java.io.*;
import java.io.*;
import java.util.StringTokenizer;
public class Test {
  public Test() {
  }

public void execute(String str) { String date, time, firstName, lastName, cardNo; StringTokenizer st = new StringTokenizer(str, " "); date = st.nextToken(); time = st.nextToken(); st.nextToken(); //Admitted lastName = st.nextToken(",").trim(); firstName = st.nextToken(",(").trim(); st.nextToken("#"); //Card cardNo = st.nextToken(")#"); System.out.println("date = " + date +"\ntime = " + time +"\nfirstName = " + firstName +"\nlastName = "+ lastName +"\ncardNo = " +cardNo); }

public static void main(String args[]) { Test t = new Test(); String record1 = "12/18/2009 02:08:26 Admitted Doe, John (Card #111) at South Lobby [In]"; String record2 = "12/18/2009 02:08:26 Admitted Van Halen, Eddie (Card #222) at South Lobby [In]"; String record3 = "12/18/2009 02:08:26 Admitted Thoreau, Henry David (Card #333) at South Lobby [In]"; t.execute(record1); t.execute(record2); t.execute(record3); } }
导入java.util.StringTokenizer; 公开课考试{ 公开考试(){ }

公共void执行(字符串str){ 字符串日期、时间、名字、姓氏、卡号; StringTokenizer st=新的StringTokenizer(str,“”); 日期=st.nextToken(); 时间=st.nextToken(); st.nextToken();//承认 lastName=st.nextToken(“,”).trim(); firstName=st.nextToken(“,(”).trim(); 圣奈克特肯(“#”)信用卡 cardNo=st.nextToken(“)#”; System.out.println(“date=“+date+”\ntime=“+time+”\nfirstName=“+firstName+”\nlastName=“+lastName+”\ncardNo=“+cardNo”); }

公共静态void main(字符串参数[]){ 测试t=新测试(); String record1=“12/18/2009 02:08:26允许Doe,John(Card#111)在南大厅[In]”; String record2=“12/18/2009 02:08:26范·哈伦和埃迪(卡片#222)在南大厅[In]承认”; String record3=“12/18/2009 02:08:26梭罗、亨利·大卫(Card#333)在南大厅(In)承认”; t、 执行(记录1); t、 执行(记录2); t、 执行(记录3); } }

相信你的勇气…:) 使用StringTokenizer:
import java.io.*;
import java.io.*;
import java.util.StringTokenizer;
public class Test {
  public Test() {
  }

public void execute(String str) { String date, time, firstName, lastName, cardNo; StringTokenizer st = new StringTokenizer(str, " "); date = st.nextToken(); time = st.nextToken(); st.nextToken(); //Admitted lastName = st.nextToken(",").trim(); firstName = st.nextToken(",(").trim(); st.nextToken("#"); //Card cardNo = st.nextToken(")#"); System.out.println("date = " + date +"\ntime = " + time +"\nfirstName = " + firstName +"\nlastName = "+ lastName +"\ncardNo = " +cardNo); }

public static void main(String args[]) { Test t = new Test(); String record1 = "12/18/2009 02:08:26 Admitted Doe, John (Card #111) at South Lobby [In]"; String record2 = "12/18/2009 02:08:26 Admitted Van Halen, Eddie (Card #222) at South Lobby [In]"; String record3 = "12/18/2009 02:08:26 Admitted Thoreau, Henry David (Card #333) at South Lobby [In]"; t.execute(record1); t.execute(record2); t.execute(record3); } }
导入java.util.StringTokenizer; 公开课考试{ 公开考试(){ }

公共void执行(字符串str){ 字符串日期、时间、名字、姓氏、卡号; StringTokenizer st=新的StringTokenizer(str,“”); 日期=st.nextToken(); 时间=st.nextToken(); st.nextToken();//承认 lastName=st.nextToken(“,”).trim(); firstName=st.nextToken(“,(”).trim(); 圣奈克特肯(“#”)信用卡 cardNo=st.nextToken(“)#”; System.out.println(“date=“+date+”\ntime=“+time+”\nfirstName=“+firstName+”\nlastName=“+lastName+”\ncardNo=“+cardNo”); }

公共静态void main(字符串参数[]){ 测试t=新测试(); String record1=“12/18/2009 02:08:26允许Doe,John(Card#111)在南大厅[In]”; String record2=“12/18/2009 02:08:26范·哈伦和埃迪(卡片#222)在南大厅[In]承认”; String record3=“12/18/2009 02:08:26梭罗、亨利·大卫(Card#333)在南大厅(In)承认”; t、 执行(记录1); t、 执行(记录2); t、 执行(记录3); }
}

当您有一个公共定界符时,字符串标记器非常好,但在本例中我选择正则表达式。

当您有一个公共定界符时,字符串标记器非常好,但在本例中我选择正则表达式。

我选择java.util.Scanner。。。这段代码会让你开始。。。您应该真正使用scanner方法的模式形式,而不是我使用的字符串形式

import java.util.Scanner;

public class Main
{
    public static void main(String[] args)
        throws Exception
    {
        final String  str;
        final Scanner scanner;
        final String  date;
        final String  time;
        final String  word;
        final String  lastName;
        final String  firstName;

        str       = "12/18/2009 02:08:26 Admitted Doe, John (Card #111) at South Lobby [In]";
        scanner   = new Scanner(str);
        date      = scanner.next("\\d+/\\d+/\\d+");
        time      = scanner.next("\\d+:\\d+:\\d+");
        word      = scanner.next();
        lastName  = scanner.next();
        firstName = scanner.next();
        System.out.println("date : " + date);
        System.out.println("time : " + time);
        System.out.println("word : " + word);
        System.out.println("last : " + lastName);
        System.out.println("first: " + firstName);
    }
}

我会选择java.util.Scanner。。。这段代码会让你开始。。。您应该真正使用scanner方法的模式形式,而不是我使用的字符串形式

import java.util.Scanner;

public class Main
{
    public static void main(String[] args)
        throws Exception
    {
        final String  str;
        final Scanner scanner;
        final String  date;
        final String  time;
        final String  word;
        final String  lastName;
        final String  firstName;

        str       = "12/18/2009 02:08:26 Admitted Doe, John (Card #111) at South Lobby [In]";
        scanner   = new Scanner(str);
        date      = scanner.next("\\d+/\\d+/\\d+");
        time      = scanner.next("\\d+:\\d+:\\d+");
        word      = scanner.next();
        lastName  = scanner.next();
        firstName = scanner.next();
        System.out.println("date : " + date);
        System.out.println("time : " + time);
        System.out.println("word : " + word);
        System.out.println("last : " + lastName);
        System.out.println("first: " + firstName);
    }
}

您的记录格式非常简单,我只需要使用String的方法来获取日期和时间。正如在注释中指出的,名称中可以包含空格,这会使事情变得非常复杂,以至于按空格分割记录并不能适用于每个字段。我使用正则表达式获取其他三条信息

public static void main(String[] args) {
    String record1 = "12/18/2009 02:08:26 Admitted Doe, John (Card #111) at South Lobby [In]";
    String record2 = "12/18/2009 02:08:26 Admitted Van Halen, Eddie (Card #222) at South Lobby [In]";
    String record3 = "12/18/2009 02:08:26 Admitted Thoreau, Henry David (Card #333) at South Lobby [In]";

    summary(record1);
    summary(record2);
    summary(record3);
}

public static void summary(String record) {
    String[] tokens = record.split(" ");

    String date = tokens[0];
    String time = tokens[1];

    String regEx = "Admitted (.*), (.*) \\(Card #(.*)\\)";
    Pattern pattern = Pattern.compile(regEx);
    Matcher matcher = pattern.matcher(record);
    matcher.find();

    String lastName = matcher.group(1);
    String firstName = matcher.group(2);
    String cardNumber = matcher.group(3);

    System.out.println("\nDate: " + date);
    System.out.println("Time: " + time);
    System.out.println("First Name: " + firstName);
    System.out.println("Last Name: " + lastName);
    System.out.println("Card Number: " + cardNumber);
}
正则表达式
使用分组括号存储您试图提取的信息。必须对记录中存在的括号进行转义

运行上面的代码可以得到以下输出:

Date: 12/18/2009
Time: 02:08:26
First Name: John
Last Name: Doe
Card Number: 111

Date: 12/18/2009
Time: 02:08:26
First Name: Eddie
Last Name: Van Halen
Card Number: 222

Date: 12/18/2009
Time: 02:08:26
First Name: Henry David
Last Name: Thoreau
Card Number: 333

您的记录格式非常简单,我只需要使用String的方法来获取日期和时间。正如在注释中指出的,名称中可以包含空格,这会使事情变得非常复杂,以至于按空格分割记录并不能适用于每个字段。我使用正则表达式获取其他三条信息

public static void main(String[] args) {
    String record1 = "12/18/2009 02:08:26 Admitted Doe, John (Card #111) at South Lobby [In]";
    String record2 = "12/18/2009 02:08:26 Admitted Van Halen, Eddie (Card #222) at South Lobby [In]";
    String record3 = "12/18/2009 02:08:26 Admitted Thoreau, Henry David (Card #333) at South Lobby [In]";

    summary(record1);
    summary(record2);
    summary(record3);
}

public static void summary(String record) {
    String[] tokens = record.split(" ");

    String date = tokens[0];
    String time = tokens[1];

    String regEx = "Admitted (.*), (.*) \\(Card #(.*)\\)";
    Pattern pattern = Pattern.compile(regEx);
    Matcher matcher = pattern.matcher(record);
    matcher.find();

    String lastName = matcher.group(1);
    String firstName = matcher.group(2);
    String cardNumber = matcher.group(3);

    System.out.println("\nDate: " + date);
    System.out.println("Time: " + time);
    System.out.println("First Name: " + firstName);
    System.out.println("Last Name: " + lastName);
    System.out.println("Card Number: " + cardNumber);
}
正则表达式
使用分组括号存储您试图提取的信息。必须对记录中存在的括号进行转义

运行上面的代码可以得到以下输出:

Date: 12/18/2009
Time: 02:08:26
First Name: John
Last Name: Doe
Card Number: 111

Date: 12/18/2009
Time: 02:08:26
First Name: Eddie
Last Name: Van Halen
Card Number: 222

Date: 12/18/2009
Time: 02:08:26
First Name: Henry David
Last Name: Thoreau
Card Number: 333

在分析此行时,请记住以下几点:

  • 姓氏可以有空格,因此您应该查找
  • 名字可能有一个空格,因此请查找

由于这个原因,我会根据TofuBeer的答案,调整下一个的名字和姓氏。由于多余的空格,字符串分割会很混乱。

在解析此行时,需要记住以下几点:

  • 姓氏可以有空格,因此您应该查找
  • 名字可能有一个空格,因此请查找
由于这个原因,我会根据TofuBeer的答案调整下一个的名字和姓氏。由于额外的空格,字符串分割会很混乱。

最短regexp解决方案(带类型转换):

最短正则表达式解决方案(带类型转换):


谢谢,但是使用StringTokenizer,我该如何分解字符串?谢谢,但是使用StringTokenizer,我该如何分解字符串?因此,作为从字符串中提取日期的示例,我尝试以下操作:Pattern datePattern=Pattern.compile(“[0-9]{2}/[0-9]{2}/[0-9]{4}”);然后在字符串上使用Matcher,使用该模式,我不会得到任何结果。如何正确格式化此正则表达式?因此,作为从字符串中提取日期的示例