我试图弄清楚如何将逗号分隔的字符串作为输入,并检测其中是否有任何与下列集合不匹配的字符串
{FF,SF,FB,SB,暂停}
因此,当我解析字符串(可以是上述的任何组合)时,如果它检测到“FfdsG”,例如它应该抛出错误。我假设我可以使用某种正则表达式来完成这个或一系列ifs。
编辑...
我的实施不好吗?我正在将字符串转换为全部更低然后进行比较。无论我作为输入发送什么(FB或FB,FF或其他什么),它似乎标志着一切都很糟糕......
`public static String check(String modes) {
String s = modes;
String lower = s.toLowerCase();
HashSet<String> legalVals = new HashSet<String>();
legalVals.add("ff");
legalVals.add("sf");
legalVals.add("fb");
legalVals.add("sb");
legalVals.add("pause");
String valToCheck = lower;
if (legalVals.contains(valToCheck)) { //False
String str = modes;
} else {
return "Bad value: " + modes;
}
return modes;
}
要清楚,输入字符串可以是我列出的5个有效值的任意组合。它可能是其中之一或全部5.我只是想检测是否在任何时候检测到一个未列出的值的值。我希望这是有意义的。
结束以下情况。
String[] words = {"ff", "sf", "fb", "sb", "pause"};
List<String> validList = Arrays.asList(words);
String checkInput = lower;
for (String value : checkInput.split( "," ))
{
if( !validList.contains( value ) )
{
throw new Exception("Invalid mode specified: " + modes);
}
}
答案 0 :(得分:2)
例如,您可以将合法值存储在HashSet
中,然后使用contains()
方法检查列表中是否有特定值:
HashSet<String> legalVals = new HashSet<String>();
legalVals.add("FF");
legalVals.add("SF");
//etc
String valToCheck = "FfdsG";
if (legalVals.contains(valToCheck)) { //False
print "Value found: " + valToCheck;
} else {
print "Bad value: " + valToCheck;
}
答案 1 :(得分:1)
(?<=(^|,))(?!((FF|SF|FB|SB|Pause)(?=(,|$))))
如果文本与此正则表达式匹配,则它包含错误的值。此正则表达式与任何文本都不匹配,它仅使用断言并检测错误文本开始的位置。 如果你想第一次出现错误的文字:
(?<=(?:^|,))(?!(?:(?:FF|SF|FB|SB|Pause)(?=(?:,|$))))([^,]*)
第一个捕获的组将包含它。
答案 2 :(得分:0)
inputString.matches("FF|SF|FB|SB|Pause")
假设您已经拆分了逗号分隔的字符串输入,而inputString是该分割数组中的一个元素。
答案 3 :(得分:0)
不确定你想要什么。对于下面的正则表达式,如果所有字符串都是好的,matches()将返回true,如果有一个或多个坏字符串,则返回false。此正则表达式允许在字符串的开头或结尾处有任何数量的空格。此外,将忽略多个逗号。例如,“FF,SF ,,,,,,,, Pause”是匹配。从正则表达式中删除“\ s *”以禁止空格。
(\s*(FF|FB|SF|SB|Pause)\s*,*)+
答案 4 :(得分:0)
我不是正则表达式,但如果你单独查看每个值,它可以更好地控制如何报告错误,并让你决定拒绝整个输入或只删除无效的条目。
public class InputCleaner
{
private final static List<String> allowedEntries = Arrays.asList( new String[] { "FF", "SF", "FB", "SB", "Pause" } );
public static void main( String[] args ) throws Exception
{
String input = "FF,SF,FB,SB,FF,Pause";
String input2 = "FF,SF,FB,SB,FfdsG,FF,Pause";
validateInput( input );
validateInput( input2 );
}
private static void validateInput( String input ) throws Exception
{
for (String value : input.split( "," ))
{
if( !allowedEntries.contains( value ) )
{
throw new Exception( "Found a bad input value! " + value );
}
}
System.out.println( "Input string clean:" + input );
}
}
答案 5 :(得分:0)
是的,Java具有良好的正则表达式支持,并且很容易在正则表达式中使用“OR”运算符来执行您想要执行的操作。这样的事情应该说明一点:
package exp;
import java.io.Console;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class RegexTestHarness {
public static void main(String[] args){
Pattern pattern = Pattern.compile("FF|SF|FB|SB|Pause");
Matcher matcher = pattern.matcher( "FfdsG" );
if (matcher.matches()) {
System.out.printf("I found the text \"%s\" starting at " +
"index %d and ending at index %d.%n",
matcher.group(), matcher.start(), matcher.end());
}
else {
System.out.printf("No match found.%n");
}
matcher =
pattern.matcher( "FF" );
if (matcher.matches()) {
System.out.printf("I found the text \"%s\" starting at " +
"index %d and ending at index %d.%n",
matcher.group(), matcher.start(), matcher.end());
}
else {
System.out.printf("No match found.%n");
}
matcher =
pattern.matcher( "Pause" );
if (matcher.matches()) {
System.out.printf("I found the text \"%s\" starting at " +
"index %d and ending at index %d.%n",
matcher.group(), matcher.start(), matcher.end());
}
else {
System.out.printf("No match found.%n");
}
}
}
当你运行它时,你会得到这个输出:
找不到匹配。
我发现文本“FF”从索引0开始,到索引2结束。
我发现文本“暂停”从索引0开始,到索引5结束。
因此,只需将逗号分隔的字符串,循环遍历条目并使用匹配器。
或者你可以构建一个更复杂的正则表达式,让你留下逗号并仍然得到所需的输出。在这一点上查看许多不同的正则表达式教程...
请注意,String上的 split 方法可以让您轻松地分隔原始逗号分隔字符串中的离散值。