我有一系列格式的地址行:12345 Some Address,Some Square |电话号码|姓氏
例如:
40327 Ocie Camp Apt。 117,Maywood | 1-155-932-2562 x738 | Sauer Meredith
76106 Tomas Highway,Santa Ana | 722.884.5632 | Roberts Westley 19056
Jamarcus Lane,Lawndale |(151)847-7455 x133 | Haag Camille 66724 Slip
12-C,Hoover | 841.047.3195 x69422 | Trantow Danielle 99824 Fisher Locks
#247,Akron |(565)132-9970 x93939 | Wiza Bell
我正在尝试仅提取姓氏部分。
我尝试过典型的str.substring(str.indexOf(“|”),str.indexOf(“”)),但很明显这会导致提取错误的字符串。
关于如何从这些字符串中获取姓氏的任何想法?
答案 0 :(得分:1)
如果您的数据是以一种形式定义的,那么您必须具有以下数据结构:
" 12345一些地址,一些广场|电话号码|姓氏和#34;
然后你可以将每一行拆分为管道char并获取索引为2的元素
String myString = "12345 Some Address, Some Square|phone number|surname name";
String[] x = myString.split("\\|");
System.out.println(x[2]);
如果某些元素改变了它的顺序,这种方法不会起作用,如果缺少某些元素,这种方法就无法工作,所以你需要注意那个验证输入之前......
另一种方法是获取管道的最后一个索引 | 并使用 String #substring()
进行截断int c = myString.lastIndexOf("|");
System.out.println(myString.substring(c + 1));
答案 1 :(得分:1)
您可以使用正则表达式执行此操作。
^.*\|([^\d]+)[^|]*$
<强>代码强>
System.out.println(s.replaceAll("^.*\\|([^\\d]+)[^|]*$", "$1"));
<强>输出强>
Sauer Meredith
Roberts Westley
Haag Camille
Trantow Danielle
Wiza Bell
答案 2 :(得分:0)
我会使用Regular Expressions。
<强>代码:强>
@Test
public void test() {
String[] lines
= ("40327 Ocie Camp Apt. 117, Maywood|1-155-932-2562 x738|Sauer Meredith\n" +
"76106 Tomas Highway, Santa Ana|722.884.5632|Roberts Westley")
.split("\n");
Pattern pattern = Pattern.compile("^(?<address>.*?)\\|(?<number>.*?)\\|(?<surname>.*?) (?<name>.*?)$");
for (String line : lines) {
Matcher matcher = pattern.matcher(line);
if(matcher.find()) {
String surname = matcher.group("surname");
System.out.println(surname);
}
}
}
<强>输出:强>
绍尔
罗伯茨
表达式匹配您给出的格式的单行,然后您可以轻松访问所需字符串的单个部分。
如果您希望将来访问不同的部分,这也更容易维护。
答案 3 :(得分:0)
使用lastIndexOf
方法
此方法返回此对象表示的字符序列中最后一次出现的索引,该索引小于或等于fromIndex,如果该字符在该点之前未出现,则返回-1。
示例:
String data = "40327 Ocie Camp Apt. 117, Maywood|1-155-932-2562 x738|Sauer Meredith";
System.out.println(data.substring(data.lastIndexOf('|') + 1));
答案 4 :(得分:0)
这是正则表达式的工作:
reg [15:0] SIGNAL_i;
reg [15:0] SIGNAL_ii;
reg [15:0] SIGNAL_noise_i;
reg [15:0] SIGNAL_noise_reg; //za hranjenje zasumljenega signala
int RANDOM_noise_i;
int COUNT_end;
int COUNT;
initial SIGNAL_i=1;
initial COUNT_end=0;
initial COUNT=3'd4;
initial SIGNAL_ii=0;
initial SIGNAL_noise_i=1;
initial SIGNAL_noise_reg=0;
initial RANDOM_noise_i=1;
initial CLK = 1;
always #5 CLK = ~CLK;
always #10
begin
SIGNAL_noise_reg <= SIGNAL_noise_i;
RANDOM_noise_i = $signed($urandom_range(0,2))-1; //random noise generation
//upcount
if ((SIGNAL_i<16'd30766) && (SIGNAL_ii<SIGNAL_i)) //32765
begin
begin
if (COUNT_end==COUNT)
begin
assign SIGNAL_noise_i=SIGNAL_i + (RANDOM_noise_i);
SIGNAL_i=SIGNAL_i + 1;
SIGNAL_ii=SIGNAL_ii + 1;
COUNT_end=0;
COUNT_end=0;
end
else
begin
assign SIGNAL_noise_i=SIGNAL_i + (RANDOM_noise_i);
COUNT_end= COUNT_end + 1;
end
end
end
//counter on zero
else if (SIGNAL_i == 0)
begin
SIGNAL_i = 1;
SIGNAL_ii = 0;
SIGNAL_noise_i = SIGNAL_i + RANDOM_noise_i;
end
//down count
else
begin
if (COUNT_end==COUNT)
begin
assign SIGNAL_noise_i=SIGNAL_i + (RANDOM_noise_i);
SIGNAL_i=SIGNAL_i - 1;
SIGNAL_ii=SIGNAL_ii + 1;
COUNT_end=0;
COUNT_end=0;
end
else
begin
assign SIGNAL_noise_i=SIGNAL_i + (RANDOM_noise_i);
COUNT_end= COUNT_end + 1;
end
end
end
end
这将输出
Pattern rx = Pattern.compile("[^\\|]*\\|[^\\|]*\\|\\s*([^0-9]+)");
String line = "76106 Tomas Highway, Santa Ana|722.884.5632|Roberts Westley 19056";
Matcher m = rx.matcher(line);
if(m.find()){
String surname = m.group(1).trim();
System.out.println(surname);
}
答案 5 :(得分:0)
试一试。它会给你一个姓氏。
String address = "40327 Ocie Camp Apt. 117, Maywood|1-155-932-2562 x738|Sauer Meredith";
System.out.println(address.substring(address.indexOf("|", address.indexOf("|") + 1) + 1, address.length()).split(" ")[0]);