繁体   English   中英

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

[英]To match a bar code: Add regex to a given string, whithout changing the string itself

我得到以下格式的字符串:00123456

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

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

因此,在Java代码中,我需要这样的事情,改变内部消除第一个字符串本身。 只能在字符串之前和/或之后添加一些内容:

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

先感谢您 :)

编辑:到目前为止,谢谢您的回答,但是问题是,我无法更改客户端应用程序的代码。 客户端应用程序执行userInputString.matches(givenStringWithRegex),但我无法更改此设置。 这就是为什么我需要另一个解决方案的原因,例如在不更改字符串本身的情况下将regex添加到给定的字符串。

Edit2:这是客户端应用程序中的代码,在这里我什么也不能更改。 “ regex”变量是给定的字符串,“ scannedValue”是用户输入(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);
    }
}

只需使用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
String givenString = "00123456".substring(2); 
String userInput = "123456";

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

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

你能做这样的事情:

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

除了您的问题外,您永远无法在Java中更改String :它们是不可变的。 但是您可以复制原始String的任意数量。 因此,您可以使用substring削减0 s,而无需更改原始String:

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)) {...}

因此,使用常规表达式似乎太可怕了!

字符串是不可变的。 您可以执行以下操作:

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
}
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");
    }
}

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

 scannedValue.matches(regex) 

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM