Java 机器人向上、下、左、右任意4个方向移动,具体数字在1-9之间

Java 机器人向上、下、左、右任意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

我在修正这个正则表达式时遇到了问题

问题:假设机器人可以在四个方向(前进(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 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])+$