Java String过滤掉不需要的字符

时间:2017-05-26 07:46:15

标签: java regex string char special-characters

我有这样的字符串:

−+-~*/@$^#¨%={}[häagen-dazs;:] a (le & co') jsou "výborné" <značky>?!.

我想最终得到这个:

häagen-dazs a le & co jsou výborné značky.

How to filter string for unwanted characters using regex?相比,我想在字符串中保持重音(变音符号)。

我使用以下replaceAll:

str.replaceAll("[¨%=;\\:\\(\\)\\$\\[\\]\\{\\}\\<\\>\\+\\*\\−\\@\\#\\~\\?\\!\\^\\'\\\"\\|\\/]", "");
  • 这是正确的做法吗?
  • 是否有更简单的方法如何只保留字母数字字符(以及重音符号),空格和&amp; 。 - 符号?

3 个答案:

答案 0 :(得分:1)

您可以循环浏览所有输入String字符并测试每个字符是否符合您想要的正则表达式保留它,使用此正则表达式[a-zA-Z& \\-_\\.ýčéèêàâùû]分别测试每个字符。

这是您需要的代码:

    String input = "−+-~*/@$^#¨%={}[häagen-dazs;:] a (le & co') jsou výborné <značky>?!";
    StringBuffer sb =  new StringBuffer();
    for(char c : input.toCharArray()){
       if((Character.toString(c).toLowerCase()).matches("[a-zA-Z& \\-_\\.ýčéèêàâùû]")){
           sb.append(c);
       }
    }
    System.out.println(sb.toString()); 

<强>演示:

这里的a working Demo使用此代码并提供以下输出:

-hagen-dazs. a le & co jsou výborné značky

注意:

  • 它使用input.toCharArray()获取char的数组并循环遍历它。
  • 使用(Character.toString(c).toLowerCase()).matches("[a-zA-Z& \\-_\\.ýčéèêàâùû]")来测试迭代的char是否与允许的字符Regex匹配。
  • 它使用StringBuffer构建一个只有String的新#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Thu Apr 20 17:23:07 2017 @author: gengyoung """ from tensorflow.examples.tutorials.mnist import input_data import tensorflow as tf mnist = input_data.read_data_sets("MNIST_data/",one_hot=True) sess = tf.InteractiveSession() def weights(shape): return tf.Variable(tf.truncated_normal(shape,stddev=0.1)) def biases(shape): return tf.Variable(tf.constant(0.1,shape=shape)) def conv2d(X,W): return tf.nn.conv2d(X,W,[1,1,1,1],padding='SAME') def max_pool_2x2(X): return tf.nn.max_pool(X,[1,2,2,1],[1,1,1,1],padding='SAME') X = tf.placeholder(dtype=tf.float32,shape=[None,784]) y = tf.placeholder(dtype=tf.float32,shape=[None,10]) keep_prob = tf.placeholder(tf.float32) X_train = tf.reshape(X,[-1,28,28,1]) w1 = weights([5,5,1,32]) b1 =biases([32]) conv1 = tf.nn.relu(conv2d(X_train,w1)+b1) pool1 = max_pool_2x2(conv1) w2 = weights([5,5,32,64]) b2 = biases([64]) conv2 = tf.nn.relu(conv2d(pool1,w2)+b2) pool2 = max_pool_2x2(conv2) f_w1 = weights([7*7*64,1024]) f_b1 = biases([1024]) f_w2 = weights([1024,10]) f_b2 = biases([10]) flatten_pool2 = tf.reshape(pool2,[-1,7*7*64]) h1 = tf.nn.relu(tf.matmul(flatten_pool2,f_w1)+f_b1) h1_drop = tf.nn.dropout(h1,keep_prob) predict_y = tf.nn.softmax(tf.matmul(h1_drop,f_w2)+f_b2) cross_entropy = tf.reduce_mean(-tf.reduce_sum(y*tf.log(predict_y),reduction_indices=[1])) train_step = tf.train.AdamOptimizer(0.0001).minimize(cross_entropy) corrct_prediction = tf.equal(tf.argmax(predict_y,1),tf.argmax(y,1)) accuracy = tf.reduce_mean(tf.cast(corrct_prediction,tf.float32)) tf.global_variables_initializer().run() for i in range(2000): batch = mnist.train.next_batch(50) if i%100 == 0: train_accuracy = accuracy.eval(feed_dict={X:batch[0],y:batch[1],keep_prob:1.0}) print("step:%04d accuracy:%.9f"%(i,train_accuracy)) train_step.run(feed_dict={X:batch[0],y:batch[1],keep_prob:0.5}) print("Test accuracy: %.9f"%accuracy.eval(feed_dict={X:mnist.test.images,y:mnist.test.labels, keep_prob:1.0})) 允许的字符。

答案 1 :(得分:1)

您需要使用

String res = input.replaceAll("(?U)[^\\p{L}\\p{N}\\s&.-]+", "");

请注意,正则表达式匹配除(因为[^...]是否定的字符类)之外的任何字符,一次或多次(由于+量词):

  • \p{L} - 任何Unicode字母
  • \p{N} - 任何Unicode数字
  • \s - 由于\s内联(?U)修饰符版本,任何Unicode空格(Pattern.UNICODE_CHARACTER_CLASS都会识别Unicode)
  • & - 文字&
  • . - 文字.
  • - - 一个字面连字符(因为它位于字符类的末尾

Java demo

import java.util.*;
import java.lang.*;

class Rextester
{  
    public static void main(String args[])
    {
        String input = "−+-~*/@$^#¨%={}[häagen-dazs;:] a (le & co') jsou výborné <značky>?!";
        input = input.replaceAll("(?U)[^\\p{L}\\p{N}\\s&.-]+", "");
        System.out.println(input);
    }
}

输出:-häagen-dazs a le & co jsou výborné značky

答案 2 :(得分:0)

试试这个

str.replaceAll("[\\\/\.\:\%\!\[\]\(\)\{\}\?\^\*\+\"\'#@$;¨=&<>-~−]", "");

你的正则表达式与sintax有问题,我建议你一步一步建立你的正则表达式,以便立即找出是否有错误。

尝试使用此网站实时测试正则表达式,它非常好

https://regex101.com/