【问题标题】:java regex pattern matchjava 正则表达式模式匹配
【发布时间】:2016-04-24 02:56:40
【问题描述】:

我的字符串很少

  1. "abcd: 1234"
  2. "abcd : 1234"
  3. "abcd : 1234"
  4. "abcd: 1234"
  5. "abcd 1234"
  6. "abcd : abcd dgdfgdf abcd dgdsfsdf"

请帮助 java 代码用 xyz 替换 abcd 而不删除前 4 个字符串中的空格并保留第 5 个字符串,第 6 个字符串仅将 abcd 的第一个实例替换为 1234,因为要匹配的模式是 abcd :

【问题讨论】:

    标签: java regex


    【解决方案1】:

    试试这个:

    public class Test {     
        public static void main(String[] args) {
            String[] saveSpace = {
                "abcd: 1234",
                "abcd : 1234",
                "abcd : abcd dgdfgdf abcd dgdsfsdf",
                "abcd 1234",
                "asdasdas abcd abcd: sdfdsf"
            };
    
            String regex = "abcd(?!\\s*\\w)(?=(?:[^:]*\\:){1}[^:]*$)";
            String replace = "xyz";
    
            for(int i = 0; i<saveSpace.length; i++) {
                saveSpace[i] = saveSpace[i].replaceFirst(regex, replace);
                System.out.println(saveSpace[i]);
            }
        }
    }
    

    这个输出:

    xyz: 1234
    xyz : 1234
    xyz : abcd dgdfgdf abcd dgdsfsdf
    abcd 1234
    asdasdas abcd xyz: sdfdsf
    

    它应该匹配 abcd 后跟任意数量的空格、; 并且没有来自 [a-zA-Z0-9] 的字符

    【讨论】:

    • 是的。除非我遗漏了什么,否则该方法应该仍然有效
    • 如果字符串是 "asdasdas abcd abcd: sdfdsf" 它将不起作用。在这种情况下,我应该只替换 abcd 的第二个实例,并记住 abcd 和之间的空格应该被忽略:跨度>
    • 我知道你现在得到了什么
    • @michealmarquiz 如果没有,请告诉我
    • @Dan 不要分配参数(如您的 checkString() 方法中所示)。一般是bad practice
    【解决方案2】:

    所以这是所要求的快速回答,因为其他人似乎更喜欢讨论而不是代码......

    String input[] = {
        "abcd: 1234",
        "abcd : 1234",
        "abcd    : 1234",
        "abcd:       1234",
        "abcd 1234",
        "abcd : abcd dgdfgdf abcd dgdsfsdf",
        "abcd abcd: dgdfgdf abcd dgdsfsdf",
        "sdsdsdsad abcd abcd : dgdfgdf abcd dgdsfsdf"
    };
    
    for (String s: input) {
        String output = s.replaceFirst("^(.*)abcd((?=\\s*:).*)$", "$1xyz$2");
        System.out.println(output);
    }   
    

    这给了你:

    xyz: 1234
    xyz : 1234
    xyz    : 1234
    xyz:       1234
    abcd 1234
    xyz : abcd dgdfgdf abcd dgdsfsdf
    abcd xyz: dgdfgdf abcd dgdsfsdf
    sdsdsdsad abcd xyz : dgdfgdf abcd dgdsfsdf
    

    希望这会有所帮助(并结束讨论)。

    【讨论】:

    • 非常感谢.. 但是一旦出现小问题.. abcd 可以在任何地方,而不仅仅是第一个实例.. 示例:“abcd abcd: dgdfgdf abcd dgdsfsdf”、“sdsdsdsad abcd abcd : dgdfgdf abcd dgdsfsdf”在这些示例中,仅应替换“abcd:”或“abcd:”
    • @michealmarquiz 我已经相应地编辑了答案。我猜对了吗abcd : 每行最多出现一次?
    【解决方案3】:

    试试这个:

    public void checkString(String s) {
        if(s.contains(":"))
            s.replaceFirst("abcd", "xyz");
    }
    

    然后调用 checkString 并插入每个字符串。

    checkString(string1)
    checkString(string2)
    ...
    

    String 类中的replaceFirst 函数将第一个字符串的第一次出现替换为第二个字符串。 contains 函数检查字符串是否包含字符串“:”(在这种情况下),如果存在则返回 true。

    【讨论】:

    • your_string 不能是 4 个字符串。只写一行代码可不是什么好建议。
    • 但是 Java 规则不会经常更改,并且您的代码存在问题,如果您对其进行测试,这将是显而易见的。因此,请在发布/更新您的答案之前确保它是正确的(这不是一场比赛)。
    • @michealmarquiz "这里有这么多恶霸" 是什么让你有这种感觉? Stack Overflow 的目的是成为清晰的编程问题和答案的可搜索存储库。如果任何一个问题/答案质量低下(不清楚或完全错误),那么它对其他人没有用,这意味着在当前形式下它不属于这里,因此我们要求其作者进行更正/澄清。
    • 好吧,如果问题质量低下,至少给机会编辑问题,检查这里的人的答案。与其假设 OP 没有尝试,不如尝试实际帮助如何?欺负试图提供帮助的人,说代码没有经过测试等等。在没有机会纠正错误的情况下关闭问题。如果人们花足够的时间检查 API、书籍、尝试代码等。
    • 我很确定可以找到大多数问题的解决方案,而无需在此处发布。有时人们可能急于快速获得答案或尝试正确的方向,他们会在此处发布问题。一个问题对你来说可能很简单,但请不要以为每个人都很简单。
    猜你喜欢
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多