如何使用java获取带有选项vale的特定子字符串
我有一个字符串,我想从这个字符串中获取密码文件路径,该路径由一个选项(-sn)标识 上面的行是一个配置行,可以是如何使用java获取带有选项vale的特定子字符串,java,Java,我有一个字符串,我想从这个字符串中获取密码文件路径,该路径由一个选项(-sn)标识 上面的行是一个配置行,可以是-sn或-n。 请建议如何从上面的字符串中获取D:\workdir\PV_81\config\sum81pv.pwf行,或者该字符串可能带有引号 下面是我的代码,它只检查-sn选项,但我想使用-sn或-n进行检查 if ( s.matches( "^\\s*msql.*$" ) ) { StringTokenizer st = new StringTokenizer( s,
-sn
或-n
。
请建议如何从上面的字符串中获取D:\workdir\PV_81\config\sum81pv.pwf
行,或者该字符串可能带有引号
下面是我的代码,它只检查-sn选项,但我想使用-sn或-n进行检查
if ( s.matches( "^\\s*msql.*$" ) )
{
StringTokenizer st = new StringTokenizer( s, " " );
while ( st.hasMoreTokens() )
{
if ( st.nextToken().equals( "-sn" ) )
{
pwf = st.nextToken();
}
}
}
我想使用StreamTokenizer而不是StringTokenizer类,并获取D:\workdir\PV_81\config\sum81pv.pwf
此路径中可能包含空格
String s = "msqlsum81pv 0 0 25 25 25 2 -sn D:\workdir\PV_81\config\sum81pv.pwf -C 5000"
if ( s.matches( "^\\s*msql.*$" ) )
{
StreamTokenizer tokenizer = new StreamTokenizer(new StringReader(s));
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF)
{
System.out.println(tokenizer.sval);
}
}
您应该使用正则表达式以更一般的方式检测该选项。如果需要快速修复,可以在If中使用
或运算符,但每次出现新操作时,If都会增长,这是个坏主意
if ( s.matches( "^\\s*msql.*$" ) )
{
StringTokenizer st = new StringTokenizer( s, " " );
while ( st.hasMoreTokens() )
{
string token = st.nextToken();
if ( token.equals( "-sn" ) || token.equals("-n" ) )
{
pwf = st.nextToken();
}
}
}
使用正则表达式,如本例所示
public static void main(String[] args) {
System.out.println(findString("msqlsum81pv 0 0 25 25 25 2 -sn D:\\workdir\\PV_81\\config\\sum81pv.pwf -C 5000"));
System.out.println(findString("msqlsum81pv 0 0 25 25 25 2 -s D:\\workdir\\PV_81\\config\\sum81pv.pwf -C 5000"));
System.out.println(findString("msqlsum81pv 0 0 25 25 25 2 -sn \"D:\\workdir\\PV_81\\config\\sum81pv.pwf\" -C 5000"));
System.out.println(findString("msqlsum81pv 0 0 25 25 25 2 -s \"D:\\workdir\\PV_81\\config\\sum81pv.pwf\" -C 5000"));
}
private static String findString(String inputCommand) {
String path;
if(inputCommand.matches(".*(-sn|-s) \"+.*")) {
path = inputCommand.replaceAll(".*(-sn|-s) \"?([^\"]*)?.*", "$2");
} else {
path = inputCommand.replaceAll(".*(-sn|-s) \"?([^ ]*)?.*", "$2");
}
return path;
}
O/p
编辑:注意,如果路径可能包含空格,则可能需要修改此选项。然后,您可能希望一直检查到-C
,或者始终转义整个路径,并检查下一个“
何时会出现。如上所述,您可以使用任何好的命令行参数解析器,如:
- Commons CLI
- Java Gems
- JArgs
- GetOpt
关于类似命令的参数的更多问答:和。肯定使用正则表达式,我的答案如下
public static String extractString(final String input) {
String ret = null;
final Pattern pattern = Pattern.compile("(..\\\\.*\\.*?)(?:\"?)\\p{Space}");
final Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
ret = matcher.group(1);
}
return ret;
}
基本上,我从第一个“\”搜索到点后的第一个空格,然后提取这个子字符串,如果有引号,则使用capture group过滤引号
因此,这个子字符串在这个cmd字符串中的位置无关紧要。@KevinEsche:-是的,但我没有找到解决方案。请你推荐一些正则表达式?可能与sidenote重复:如果路径包含空格,这将失败。@acostela:-如果字符串包含带引号的字符串,会发生什么情况msqlsum81pv 0 0 25 25 2-sn \“D:\workdir\PV_81\config\sum81pv.pwf \“-C 5000”@YogendraSharma请参见我的编辑。我假设如果它是(.s \-sn)\”+
,它也以“
结尾。如果没有”
,我假设路径中没有空格,否则该命令将无效:-当路径包含空格时会发生什么情况。Ex:-“msqlsum81pv 0 0 25 25 2-sn D:\\work dir\\PV 81\\config\\sum81pv.pwf-C 5000”
D:\\workdir\\PV_81\\config\\sum81pv.pwf
D:\\workdir\\PV_81\\config\\sum81pv.pwf
D:\\workdir\\PV_81\\config\\sum81pv.pwf
D:\\workdir\\PV_81\\config\\sum81pv.pwf
public static String extractString(final String input) {
String ret = null;
final Pattern pattern = Pattern.compile("(..\\\\.*\\.*?)(?:\"?)\\p{Space}");
final Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
ret = matcher.group(1);
}
return ret;
}