我在CSV文件中有这种列表:
MaxLength
我的目标是清理这些字符串,只保留第一个分号:
TextBox
我试着这样做:
4231;"Swiss Federal Railways (SBB; CFF; FFS)"
67;"Hershey Co; The"
但这还不够。
编辑: 更清楚的是,这是我使用的代码:
4231; Swiss Federal Railways (SBB CFF FFS)
67; Hershey Co The
答案 0 :(得分:2)
在java中,您可以使用split()
函数:每次找到模式时,它都会将字符串分解为数组。
在你的情况下:
String source = "4231;\"Swiss Federal Railways (SBB; CFF; FFS)\"";
String parts[] = source.split(";");
String fullString = "";
for (int i = 0; i < parts.length; i++)
if (i != 0) fullString = fullString + parts[i];
fullString = parts[0] + ";" + fullString;
然后根据需要构建最终字符串
答案 1 :(得分:2)
((?:^[^;\v]*;|\G(?!\A))[^;\v]*);
替换
$1
在其他正则表达式中,您可以使用以下正则表达式,但Java不支持令牌\K
(重置报告的匹配的起点 - 任何以前消耗的字符不再包含在决赛)。这将使用替换空字符串而不是捕获组。
(?:^[^;\v]*;|\G(?!\A))[^;\v]*\K;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
final String regex = "((?:^[^;\\v]*;|\\G(?!\\A))[^;\\v]*);";
final String string = " 4231;\"Swiss Federal Railways (SBB; CFF; FFS)\"\n"
+ " 67;\"Hershey Co; The\"";
final String subst = "$1";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
// The substituted value will be contained in the result variable
final String result = matcher.replaceAll(subst);
System.out.println("Substitution result: " + result);
4231;"Swiss Federal Railways (SBB; CFF; FFS)"
67;"Hershey Co; The"
4231;"Swiss Federal Railways (SBB CFF FFS)"
67;"Hershey Co The"
((?:^[^;\v]*;|\G(?!\A))[^;\v]*)
将以下内容捕获到捕获组1中
(?:^[^;\v]*;|\G(?!\A))
匹配以下任一项
^[^;\v]*;
^
在行首处断言位置[^;\v]*
匹配集合中不存在的任何数字(除分号;
或垂直空格外的任何字符);
按字面意思;
\G(?!\A)
在上一场比赛结束时断言位置[^;\v]*
匹配集合中不存在的任何数字(除分号;
或垂直空格外的任何字符);
按字面意思;
答案 2 :(得分:0)
你可以替换第一次出现的;使用临时字符串,进行更改,并将临时部分还原为分号。
String s = "4231;\"Swiss Federal Railways (SBB; CFF; FFS)\"";
s = s.replaceFirst(";", "~~~").replaceAll(";", "").replaceAll("\"", "").replaceFirst("~~~", "; ");
System.out.println(s);
输出:
4231; Swiss Federal Railways (SBB CFF FFS)