【问题标题】:Regex for splitting word / (slash) word [duplicate]用于拆分单词/(斜杠)单词的正则表达式 [重复]
【发布时间】:2019-04-17 05:45:29
【问题描述】:

我真的需要一位正则表达式专家: 我需要一个正则表达式(在 java 中)来拆分这个例子:

你好/世界(单词/单词)=>你好,世界

你好/12(单词/数字)=>你好,12

15/Hello (数字/单词) => 15,Hello

12/17(数字/数字)=> 12/17(不要拆分)

更新:

这是我尝试过的,但它也标记了数字/数字选项 https://regex101.com/r/zZ9nO5/2

谢谢

【问题讨论】:

  • 因此,如果 / 前后都有数字,您不想拆分它。你可以在这里使用regular-expressions.info/lookaround.html机制。
  • 除了 Pshemo 的评论:斜线之前或之后是否有任何空格,例如12 / 17?如果是这样,那应该改变你的分裂方式吗?如果没有,那么您需要将其添加到您的正则表达式中。尝试使用(负)环视,如果需要空格匹配 (\s),如果您有问题,请向我们展示您的尝试。
  • 前后没有空格。我在正则表达式方面真的很弱,如果有人知道确切的表达式来尝试它会很棒。

标签: java regex split slash


【解决方案1】:

这可能不是最优雅的解决方案,但根据您的要求,您可以这样做:

(([a-zA-Z]+?)/([a-zA-Z]+))|(([a-zA-Z]+?)/([\d]+))| (([\d]+?)/([a-zA-Z]+))

这是对单词/单词、单词/数字和数字/单词的检查

用找到的对应组替换\2\5\8,\3\6\9

一个简单的java程序是:

  public static void main(String[] args) {
            String[] stringArray=new String[]{"Hello/World","Hello/12","15/Hello","12/17"}; 
            for(String s:stringArray) {
                System.out.println(s.replaceAll("(([a-zA-Z]+?)/([a-zA-Z]+))|(([a-zA-Z]+?)/([\\d]+))|(([\\d]+?)/([a-zA-Z]+))", "$2$5$8,$3$6$9"));
            }
        }

结果是:

Hello,World
Hello,12
15,Hello
12/17

【讨论】:

  • 可以在没有组的情况下完成吗?我的意思是正则表达式将标记'/'
  • 好吧,它会标记'/',但如果你想看看斜线两侧的内容,那么你也需要匹配它。为了以后使用它,它需要一个组。
  • 我不用看。无论如何它都会在我的代码中拆分它
  • 您需要正则表达式来查看它;)以查看它是单词/数字还是其他。如果您不需要查看它,只需拆分“/”
【解决方案2】:

多一点上下文会很好,但据我了解,你会得到一个中间有一个“/”的字符串,你可以用“,”替换“/”,或者如果它都有数字,你就不用双方。 所以我会做这样的事情:

public class MyClass {
 public static void main(String args[]) {
        String mystring = "12/25";

        if(!mystring.matches("^\\d+\\/\\d+$"))
            mystring = mystring.replace("/", ",");

        System.out.println(mystring);
    }
}

如果这就是您想要在这里做的,那么我相信它比在所有 4 种情况之间进行区分的大型正则表达式更简单,也更快。

【讨论】:

    【解决方案3】:

    略有不同的方法,但您可以检查字符串中的字符以查看它们都是数字还是正斜杠,然后在必要时拆分:

       public static void main(String[] args) {
        String[] strArray = new String[]{"Hello/World", "Hello/12", "15/Hello", "12/17"};
    
        for(String str: strArray){
            if(checkIfValid(str)){
                System.out.println(str);
            }
            else{
                System.out.println(str.replace("/", ","));
            }
        }
    }
    
    public static boolean checkIfValid(String str) {
        for (int i = 0; i < str.length(); i++) {
            if (!Character.isDigit(str.charAt(i)) && str.charAt(i) != '/') {
                return false;
            }
        }
        return true;
    }
    

    输出:

    你好,世界

    你好,12

    15,你好

    12/17

    如果Hello12/15应该被拆分,这可能会有所帮助。

    【讨论】:

    • 该语言中没有WordNumber
    • @UnknownUser 没关系 - 它仍然可以工作。
    • 我更喜欢正则表达式解决方案,因为我已经使用它来拆分其他表达式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    相关资源
    最近更新 更多