Java 机器人向上、下、左、右任意4个方向移动,具体数字在1-9之间
我在修正这个正则表达式时遇到了问题 问题:假设机器人可以在四个方向(前进(F)、后退(B)、左(L)、右(R)中的任意一个方向上移动,然后在该方向上移动的步数。它可以采取的步骤数介于1到9之间 有效操作:F4L1B3、R5F2、B7、L8F2R4B3、L1、R5 无效操作:12,LR,L2J2,K3F5,R12,F6L7R12,B5R8L+,L4-R3Java 机器人向上、下、左、右任意4个方向移动,具体数字在1-9之间,java,regex,Java,Regex,我在修正这个正则表达式时遇到了问题 问题:假设机器人可以在四个方向(前进(F)、后退(B)、左(L)、右(R)中的任意一个方向上移动,然后在该方向上移动的步数。它可以采取的步骤数介于1到9之间 有效操作:F4L1B3、R5F2、B7、L8F2R4B3、L1、R5 无效操作:12,LR,L2J2,K3F5,R12,F6L7R12,B5R8L+,L4-R3 import java.util.regex.Matcher; import java.util.regex.Pattern; public
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class extra {
public static void main(String[] args){
Scanner scn = new Scanner(System.in);
System.out.println("Enter the String: ");
String move = scn.nextLine();
finalPosition(move);
}
static void finalPosition(String move)
{
Pattern p = Pattern.compile("([F][1-9]+)|([B][1-9]+)|([L][1-9]+)|([R][1-9])") ;
Matcher m = p.matcher(move);
boolean b = m.matches();
if (b)
{
System.out.println("Robot is moving");
}else
System.out.println("Invalid input");
}
}
有4个大写字符有效,所有4个字符后面都可以跟一个数字1-9。这似乎仅在出现1次或多次的序列中有效,不允许任何其他非空白字符作为字符串的一部分 您可以将整个交替缩短为一个字符类,该字符类匹配4个允许字符中的1个,后跟数字1-9,并将其作为一个整体重复1次或多次 为了不让其他字符成为匹配的一部分,可以在左侧和右侧使用空白边界
(?<!\S)(?:[FBLR][1-9])+(?!\S)
如果这是从字符串的开头到结尾应该匹配的唯一输入,那么您也可以使用锚定:
^(?:[FBLR][1-9])+$
也许像这样
(?:(?:[FBLR][1-9])+
//可选空格(仅在移动之间):(?:\s*[FBLR][1-9])+\s
-与匹配器匹配()
一起使用在正则表达式中有[1-9]+
允许多个数字。+
可能位于括号外(最后一个选项完全没有),但你必须允许整个过程重复([F][1-9])|([B][1-9])|([L][1-9])|([R][1-9])+
(几乎与我上面的第一个建议相同)谢谢兄弟,这对我很有帮助注意:如果使用匹配器#matches()
,就像问题中的代码一样,不需要^
或$
,也不需要消极的向前看或向后看(我相信regex101不是100%Java,但几乎是)@user15244370好的观点:-)
^(?:[FBLR][1-9])+$