【发布时间】:2011-04-26 00:17:49
【问题描述】:
例如,
字符串为:“{{aaa,bbb},{ccc,ddd},{eee,fff}}”
我希望程序自动将其拆分为字符串模式
模式是:{{...},{...},{...}}
什么是模式匹配正则表达式?
【问题讨论】:
-
不需要自动添加到数组怎么样?我只需要模式匹配正则表达式,谢谢!
例如,
字符串为:“{{aaa,bbb},{ccc,ddd},{eee,fff}}”
我希望程序自动将其拆分为字符串模式
模式是:{{...},{...},{...}}
什么是模式匹配正则表达式?
【问题讨论】:
不确定你想要什么,所以这里是:
这将返回一个包含元素的String[]:
[ "aaa,bbb",
"ccc,ddd",
"eee,fff" ]
如果您使用原始字符串调用它:
public static String[] split1(String source) {
final ArrayList<String> res = new ArrayList<String>();
if (source != null) {
source = source.trim();
if (source.startsWith("{") && source.endsWith("}")) {
final Pattern p = Pattern.compile("\\{([^}]+)\\}[,]?");
final Matcher m = p.matcher(source.substring(1).substring(0, source.length() - 2));
while (m.find()) {
res.add(m.group(1));
}
}
}
return (res.toArray(new String[res.size()]));
}
编辑:这比 1a 稍微简单一点,结果相同:
public static String[] split3(final String source) {
final ArrayList<String> res = new ArrayList<String>();
if (source != null) {
final Pattern p = Pattern.compile("\\{(([^{}]+)[,]?)+\\}");
final Matcher m = p.matcher(source.trim());
while (m.find()) {
res.add(m.group(2));
}
}
return (res.toArray(new String[res.size()]));
}
这将返回一个包含元素的String[][]:
[ [ "aaa", "bbb" ],
[ "ccc", "ddd" ],
[ "eee", "fff" ] ]
如果您使用原始字符串调用它:
public static String[][] split2(String source) {
final ArrayList<String[]> res = new ArrayList<String[]>();
if (source != null) {
source = source.trim();
if (source.startsWith("{") && source.endsWith("}")) {
final Pattern p = Pattern.compile("\\{([^}]+)\\}[,]?");
final Matcher m = p.matcher(source.substring(1).substring(0,
source.length() - 2));
while (m.find()) {
res.add(m.group(1).split(","));
}
}
}
return (res.toArray(new String[res.size()][]));
}
编辑:这比 2a 稍微简单一点,结果相同:
public static String[][] split4(final String source) {
final ArrayList<String[]> res = new ArrayList<String[]>();
if (source != null) {
final Pattern p = Pattern.compile("\\{(((\\w+),(\\w+))[,]?)+\\}");
final Matcher m = p.matcher(source.trim());
while (m.find()) {
res.add(new String[] {
m.group(3),
m.group(4)
});
}
}
return (res.toArray(new String[res.size()][]));
}
这是一个主要的测试方法:
public static void main(String[] args) {
final String TEST = "{{aaa,bbb},{ccc,ddd},{eee,fff}}";
System.out.println("split1 (Option 1a)");
for (final String str : split1(TEST)) {
System.out.println(str);
}
System.out.println("split2 (Option 2a)");
for (final String[] strs : split2(TEST)) {
System.out.println(Arrays.toString(strs));
}
System.out.println("split3 (Option 1b)");
for (final String str : split3(TEST)) {
System.out.println(str);
}
System.out.println("split4 (Option 2b)");
for (final String[] strs : split4(TEST)) {
System.out.println(Arrays.toString(strs));
}
}
【讨论】:
String 有一个split(String regex) 方法,它可能被证明是有用的。它返回一个String[]。
你已经弄清楚了模式;
模式为:{{...},{...},{...}}
那里有一个反复出现的主题,用于界定您尝试提取的数组元素。您可能还想考虑如何处理您不想要的模式中的开始和结束位。
【讨论】:
已编辑。这是一个更好的解决方案。您只需创建一次已编译的 Pattern,然后通过“matcher()”例程针对每个输入字符串运行它。
Matcher m= Pattern.compile( "\\{(\\w*,\\w*)\\}" ).matcher( "{{aaa,bbb},{ccc,ddd},{eee,fff}}" );
List<String> stuffArray = new ArrayList<String>();
for ( int i = 1; m.find(); i++ )
{
stuffArray.add( m.group().replaceAll( "[{}]","" ) );
}
String[] stuffString = stuffArray.toArray( new String[ stuffArray.size() ] );
【讨论】: