掩蔽电话号码Java

时间:2017-11-21 09:16:50

标签: java regex masking

我需要屏蔽电话号码。它可能包含数字,+(国家代码)和破折号。国家/地区代码可能包含1位或更多位数字。我创建了这种正则表达式来掩盖除了最后4位之外的所有数字:

inputPhoneNum.replaceAll("\\d(?=\\d{4})", "*");

对于此类输入: +13334445678

我得到了这个结果: + ******* 5678

但是,它不适用于此类输入: + 1-333-444-5678 特别是,它返回的数字相同,没有任何变化。虽然所需的输出屏蔽了除最后4位以外的所有数字,加号和短划线。 这就是为什么我想知道如何改变我的正则表达式以包括短划线?我将不胜感激任何帮助!

6 个答案:

答案 0 :(得分:7)

使用此正则表达式进行搜索:

.(?=.{4})

RegEx Demo

区别在于.将匹配任何字符,而不仅仅是正则表达式中的数字。

Java代码:

inputPhoneNum = inputPhoneNum.replaceAll(".(?=.{4})", "*");

但是,如果您的目的是掩盖最后4位数之前的所有数字,请使用:

.(?=(?:\D*\d){4})

或者在Java中:

inputPhoneNum = inputPhoneNum.replaceAll("\\d(?=(?:\\D*\\d){4})", "*");

(?=(?:\\D*\\d){4})是一个积极的先行者,断言至少存在4位数,可以用0或更多的非数字分隔。

RegEx Demo 2

答案 1 :(得分:2)

我在RegEx中表现不佳,但我认为你应该通过摆脱-出现来规范电话号码:

   inputPhoneNum = inputPhoneNum.replace("-","").replaceAll("\\d(?=\\d{4})", "*");

答案 2 :(得分:1)

尝试使用两个替换所有非数字或+替换为空然后使用你的正则表达式:

renderInput({ input, label, type, meta: { touched, error, warning } }) {
    const renderIcon = (input.name === "card" || input.name=== "date" || input.name === "csv" || input.name === "name")
    return (
      <Item error={error && touched} style={styles.item}>
                { 
                  renderIcon && 
                  <Icon  style={styles.icon} active name={input.name === "card" ? "card" : input.name=== "date" ? "calendar": input.name === "csv" ? "unlock" : input.name === "name" ?"contact":undefined} /> 
                }
                <Input style={styles.input}
                    ref={c => (this.textInput = c)}
                    placeholder={input.name === "card" ? "Card Number": input.name==="date"?"MM":input.name==="date2"?"YY":input.name==="csv"?"CSV": "Name"}
            placeholderTextColor="#0dc49d"
                    secureTextEntry={input.name === "csv" ? true : false}
                    {...input}
                />
            </Item>

    );
  }

输出

"+1-333-444-5678".replaceAll("[^\\d\\+]", "").replaceAll("\\d(?=\\d{4})", "*");

答案 3 :(得分:0)

我认为这应该有用

".*\\d(?=\\d{4})","*"

您可以尝试使用this website进行点击和试用创建。

答案 4 :(得分:0)

如果您不想使用regex,则另一种解决方案是使用StringStringBuilder循环到*开始,然后追加前4位数字,然后追加public static String lastFour(String s) { StringBuilder lastFour = new StringBuilder(); int check = 0; for (int i = s.length() - 1; i >= 0; i--) { if (Character.isDigit(s.charAt(i))) { check++; } if (check <= 4) { lastFour.append(s.charAt(i)); } else { lastFour.append(Character.isDigit(s.charAt(i)) ? "*" : s.charAt(i)); } } return lastFour.reverse().toString(); } (并且正常添加任何非数字字符)

{{1}}

Try it online!

答案 5 :(得分:0)

这就是我使用的方法,可能会有用,只是将提供的数字中的一些数字掩盖

import {WebcamImage} from 'ngx-webcam';
import {Subject, Observable} from 'rxjs';
...
export class AppComponent {
...
   // latest snapshot
   public webcamImage: WebcamImage = null;
   // webcam snapshot trigger
   private trigger: Subject<void> = new Subject<void>();
   triggerSnapshot(): void {
    this.trigger.next();
   }
   handleImage(webcamImage: WebcamImage): void {
    console.info('received webcam image', webcamImage);
    this.webcamImage = webcamImage;
   }
  
   public get triggerObservable(): Observable<void> {
    return this.trigger.asObservable();
   }
}