【问题标题】:Checking string for large amount of different, incremental values检查字符串是否有大量不同的增量值
【发布时间】:2013-02-18 21:01:06
【问题描述】:

目前我正在检查以下字符串:

if(parseCommand.contains("vlan1") 
|| parseCommand.contains("Fa0/1i") || parseCommand.contains("Fa0/1o") 
|| parseCommand.contains("Fa1/0") || parseCommand.contains("Fa1/1") 
|| parseCommand.contains("Fa1/2") || parseCommand.contains("Fa1/3") 
|| parseCommand.contains("Fa1/4") || parseCommand.contains("Fa1/5") 
|| parseCommand.contains("Fa1/6") || parseCommand.contains("Fa1/7") 
|| parseCommand.contains("Fa1/8") || parseCommand.contains("Fa1/9") 
|| parseCommand.contains("Fa1/11") || parseCommand.contains("Gi0")) 
{
    //do things here                              
}

但是它可能包含 vlan1 到 vlan4094,我必须检查这些。最简单的方法是什么,我猜我是否必须将它全部放在一个递增到 4094 的 for 循环中?

 for (int i = 1; i <= 4094; i++)

    {
     if(parseCommand.contains("vlan"[i]))
    {  
    //do stuff here 
    }
    }

    if(other conditions from above)

    {
    //do same stuff again here
    } 

否则我可以将所有条件都粘贴在 for 循环中并在那里执行所有操作。这一切看起来都很乱,有没有一种不乱的方法?

【问题讨论】:

  • 正则表达式在这里可能有用
  • 字符串的格式是什么?是“vlan”出现多次还是只出现一次?
  • @Beau:单独的正则表达式无法进行解析,但通过提取它可以提供很大帮助。也许你可以添加一个你认为它会如何工作的答案?
  • @Tom 这将是一次,但它可能会发生多次,所以我想要一种更强大的处理方式。
  • @BeauGrantham 我建议我可以更改我最初必须为 vlan 部分匹配的内容,其余部分保持不变,这样可以。

标签: java string loops


【解决方案1】:

我认为这个正则表达式应该这样做:

String parseCommand = "vlan4094";
if (parseCommand.matches(".*?vlan([1-3][0-9]{3}|" +
                                 "[1-9][0-9]{0,2}|" +
                                 "40(9[0-4]|[0-8][0-9])).*"))
   System.out.println("matches");

[1-3][0-9]{3} - 1000-3999
[1-9][0-9]{0,2} - 1-999
9[0-4] - 90-94
[0-8][0-9] - 00-89
40(9[0-4]|[0-8][0-9]) - 4000-4094

这样的事情可能更简单:

String parseCommand = "vlan4094";
if (parseCommand.startsWith("vlan"))
{
   int v = Integer.parseInt(parseCommand.substring(4));
   if (v >= 1 && v <= 4094)
      /* do stuff */
}

建议更改:

替换:

parseCommand.contains("Fa1/0") || parseCommand.contains("Fa1/1") 
|| parseCommand.contains("Fa1/2") || parseCommand.contains("Fa1/3") 
|| parseCommand.contains("Fa1/4") || parseCommand.contains("Fa1/5") 
|| parseCommand.contains("Fa1/6") || parseCommand.contains("Fa1/7") 
|| parseCommand.contains("Fa1/8") || parseCommand.contains("Fa1/9")

parseCommand.matches(".*?Fa1/[0-9].*")

【讨论】:

  • 这似乎是合理的谢谢,很好的答案,我可以将原来的内容从 .contains 更改为 .matches 用于 vlan 部分,其余部分保持不变,这样就可以了。
【解决方案2】:

你可以将它们组合成一个布尔值

boolean b = false;

for(int i = 1 ; i < 4094 ; i ++){
    b = b || parseCommand.contains("vlan" + i);
}

然后检查你的布尔值

【讨论】:

  • 我也喜欢这个答案,感谢您换一种思考方式。
  • 是的,这是最简单易懂的答案,但效果不佳,正则表达式的方式最好。
【解决方案3】:

如果唯一的问题是“vlanXXX”,您可以删除字符串的“vlan”部分:

parseCommand = parseCommand.replaceFirst("vlan", "");

然后将其转换为 int

int value = Integer.parseInt(parseCommand);

然后将此结果与您想要的结果进行比较

if((value >= 1) && (value <= 4094)){....}

这仅适用于给定的情况,您必须处理无法将 parseCommand 强制转换为 int 的情况。而且它比使用任何正则表达式更容易理解

【讨论】:

  • 在调用replaceFirst() 之前,您可能需要测试是否为parseCommand.contains("vlan"),否则如果parseCommand = "10"(或1-4094 之间的任何数字),它也会让您进入。 T
  • 谢谢,另一个有趣的答案。确实需要在那里检查几件事!
猜你喜欢
  • 2012-12-08
  • 1970-01-01
  • 2011-05-02
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多