【问题标题】:Remove non printable character from pojo in java 8从 java 8 中的 pojo 中删除不可打印的字符
【发布时间】:2018-09-11 05:01:06
【问题描述】:

我只想删除项目中字符串字段的不可打印字符,我知道我们可以使用

public String removeNonPrintable(String field) {
    return field.replaceAll("[^A-Za-z0-9]", "");
}

从字符串中删除不可打印的字符。

但我希望有这样的通用方法:

public <T> T removeNonPrintable(Class<T> myClassObject) {
    /// Get only the string and remove non-printable code stuffs
    return removedNonPrintableCharactersmyClassObject;
}

有人可以帮我做吗?

这个问题可能是重复的,但我没有找到确切的解决方案。

【问题讨论】:

  • [A-Za-z0-9] 是您对可打印字符的最终定义吗?其他符号(./,"@$#!%^*&amp; 等)呢?
  • 你为什么返回T而不是String?或者你的意思是你想修改myClassObject 使其toString 方法只返回可打印的字符?
  • @ernest_k 我只是将它作为示例发布,将根据我的要求更新该功能。你能建议我吗,我怎样才能为整个 pojo 而不是单个字段做到这一点。
  • @kaviya.P 看来您除了反射之外还有其他选择。使方法接受一个对象。并使用对象的类查找字符串字段,并在转换文本后动态设置它们的值

标签: java string java-8


【解决方案1】:

您可以使用反射,这会产生问题并且不能保证适用于具有深层结构的字段。

或者您可以通过您的代码运行 实例

public String removeNonPrintable(Object obj) {
    return String.valueOf(obj).replaceAll("[^A-Za-z0-9]", "");
}

注意:String.valueOf() 用于避免将obj 处理为null

如果您将转换更改为:

replaceAll("[^ -~]", "")

这将删除所有“常规”ascii 字符(即在十进制 32 和 126 之间)。

【讨论】:

    【解决方案2】:

    以下工作:

    public static void removeNonPrintable(Node node) throws NoSuchFieldException, IllegalAccessException{
            Field[] fields = Node.class.getDeclaredFields();
            for(int i=0;i<fields.length;i++){
                if(fields[i].getType().equals(String.class)) {
                    fields[i].set(node, removeNonPrintable(fields[i].get(node).toString()));
                    System.out.println(fields[i].get(node));
                }
            }
        }
    
    class Node{
         String left;
         String right;
         int data;
        public Node(String left, String right, Integer data){
            this.left = left;
            this.right = right;
            this.data = data;
        }
    }
    

    它适用于特定的类(例如节点)。我正在尝试使其与 Class&lt;T&gt; 一起使用,但它现在给出了一些例外。

    【讨论】:

      【解决方案3】:

      你可以使用reflection,但不推荐:-

      public static void main(String[] args) throws IllegalAccessException {
          Person person = new Person();
          person.setName("John***");
          person.setAge(12);
      
          final Field[] fields = person.getClass().getDeclaredFields();
          for (Field field : fields) {
              if (field.getType() == String.class) {
                  field.set(person, removeNonPrintable((String) field.get(person)));
              }
          }
          System.out.println(person.getName());
          System.out.println(person.getAge());
      }
      
      //using the regex provided by OP
      private static String removeNonPrintable(String s) {
          return s.replaceAll("[^A-Za-z0-9]", "");
      }
      

      您必须将字符串字段更改为公共访问器。这打印:-

      John
      12
      

      更好的方法是在字符串字段的getter 或setter 中执行此操作。

      例子:-

      public String getName() {
          return removeNonPrintable(name);
      }
      

      public void setName(String name) {
          this.name = removeNonPrintable(name);
      }
      

      【讨论】:

        最近更新 更多