在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,使用该模式,我不会得到任何结果。如何正确格式化此正则表达式?因此,作为从字符串中提取日期的示例