匹配条形码:将正则表达式添加到给定字符串,而不更改字符串本身

时间:2014-12-18 07:24:27

标签: java regex

我收到这种格式的字符串:00123456

字符串始终为8位,始终以2为零,其他6位数字为1-9。

我必须将此字符串与另一个字符串进行比较,该字符串具有相同的结构,但没有2个零。因此,00123456应该等于123456.问题是,我没有可能更改字符串(例如删除零)。我唯一能做的就是在第一个字符串之前或之后添加正则表达式。

所以在Java代码中,我需要这样的东西, whithout 更改第一个字符串本身。我只能在之前添加和/或在字符串后添加

    String givenStringWithRegex = "(ignore zeros)00123456";
    String userInput = "123456";
    if (userInput.matches(givenStringWithRegex)) {
        // Everything is fine :)
    }

提前谢谢你:)

修改 感谢您的答案到目前为止,但问题是,我无法更改客户端应用程序的代码。客户端应用程序执行userInputString.matches(givenStringWithRegex),我无法更改此设置。这就是为什么我需要另一种解决方案,例如将正则表达式添加到给定的字符串而不更改字符串本身。

EDIT2: 这是客户端应用程序中的代码,我在这里无法改变。 "正则表达式"变量是给定的字符串和" scansValue"是用户输入(123456)。给定的字符串在我的具体示例00123456中。就像我之前写的,我无法操纵00123456.我只能在它之前或之后添加正则表达式,例如??? 00123456 ???。并且00 ??? 123456是不可能的。

我可以在高级系统的配置文件中添加此正则表达式,因此不需要更改代码。这就是我要求正则表达式解决方案的原因,因为我不想在高级系统和客户端应用程序中更改代码。

public final class RegexValidator implements StringScanValidator {

    private final String regex;

    public RegexValidator(final String regex) {
        this.regex = regex;
    }

    @Override
    public StringScanValidatorResult validate(final String scannedValue) {
        return scannedValue.matches(regex) ? new StringScanValidatorResult(true, scannedValue)
            : new StringScanValidatorResult(false, scannedValue);
    }
}

7 个答案:

答案 0 :(得分:0)

只需使用substring(),就像这样:

public static void main(String[] args) {
    String givenStringWithRegex = "00123456"; // always 8 digits
    String userInput = "123456"; //so, always 6 digits
    System.out.println(givenStringWithRegex.substring(2, 8).equals( // do substring for digits 2 to 8
            userInput));
}

O/P :

true

答案 1 :(得分:0)

String givenString = "00123456".substring(2); 
String userInput = "123456";

 if(userInput.equals(givenString) { // Everything is fine :) }

子字符串将满足您的需求。它将剪切与您相关的字符串的一部分。

答案 2 :(得分:0)

你能做这样的事吗:

String givenString = "00123456";
String userInput = "123456";
if (("00"+userInput).equals(givenString)) {
       // Everything is fine :)
}

答案 3 :(得分:0)

除了你的问题,你从不可以改变java中的String:它们是不可变的。但是你可以制作原始字符串的任意数量的副本。因此,您可以使用substring剪切0,而无需更改原始字符串:

String original = "00123456";
String compare  = "123456";
String copy = original.substring(2);
if(copy.equals(compare)) {...}

另一种方法是用零添加用户输入:

String original = "00123456";
String compare  = "123456";
if(original.equals("00"+compare)) {...}

所以使用正常的表达看起来像是可怕的过度杀伤!

答案 4 :(得分:0)

字符串是不可变的。你可以这样做:

String givenStringWithRegex = "(ignore zeros)00123456";
String userInput = "123456";
if (("00"+userInput).equals(givenStringWithRegex)) {
    //its equal and none of your strings are modified as string are immutable
}

答案 5 :(得分:0)

public static String regexStr(String str) {
    Pattern p =
        Pattern.compile("00(\\d{6})", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //start with 00 then followed by 6 digits
    Matcher m = p.matcher(str);
    if (m.find()) {
        String found= m.group(1);
        return found;
    }
    return null;
}

public static void main(String[] args) throws ParseException {
    String givenStringWithRegex = "00123456";
    String userInput = "123456";
    if (userInput.equalsIgnoreCase(regexStr(givenStringWithRegex))) {
        // Everything is fine :)
        System.out.println("Everything is fine");
    }
}

答案 6 :(得分:0)

  

这是客户端应用程序中的代码,我在这里无法改变。 “regex”变量是给定的字符串,“scanningValue”是   用户输入(123456)。给定的字符串在我的具体示例中   就像我之前写过的那样,我无法操纵00123456.我只能在它之前或之后添加正则表达式,例如??? 00123456 ???和   00 ??? 123456是不可能的。

scannedValue.matches(regex)

正则表达式规则使你的愿望无法实现。