Problemas encontrados al usar expresiones regulares en java

¿Cómo se ve una expresión regular estándar?

Nodo.js(JavaScript)

En las expresiones regulares, se utiliza una barra diagonal (/) para indicar el principio y el final de la expresión regular. En JavaScript, las expresiones regulares se pueden envolver con barras para indicar que se trata de una expresión regular literal.

En Node.js, puede utilizar el método test() de expresión regular para comprobar si una cadena coincide con un patrón. Aquí hay un código de muestra que demuestra cómo usar una expresión regular para hacer coincidir una cadena que comienza con 1 seguido de dos números:

const str = '123';
const regex = /^1\d{
    
    2}$/;

if (regex.test(str)) {
    
    
  console.log('匹配成功');
} else {
    
    
  console.log('匹配失败');
}

En el ejemplo anterior, ^1\d{2}$ es una expresión regular, lo que significa:

^: Coincide con el comienzo de la cadena
1: Coincide con el carácter 1
\d{2}: Coincide con dos números (\d significa cualquier número, {2} significa coincide dos veces)
$: Coincide con el final de la cadena

Entonces esta expresión regular puede coincidir con una cadena que comienza con 1 seguido de dos dígitos. En el ejemplo, el valor de str es 123, que coincide con este patrón, por lo que el resultado de salida es una coincidencia exitosa.

Java

private void RegTest2() {
    
    
        String content ="abc$(abc(1.23(";
        //匹配(
        String regStr = "\\d{2}";
//        String regStr = "\\.";
        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()){
    
    
            Log.i(TAG,"match:" + matcher.group(0));
        }
    }
2023-08-11 17:49:18.021 27898-29062/cn.jj.reg I/JJWorld.MainActivity: match:23

en conclusión

Existen diferencias en las expresiones regulares en diferentes idiomas y faltan expresiones regulares uniformes.

tabla de códigos ASCII

La forma de representar legalmente caracteres de escape en cadenas en Java

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Cuando Java lee el archivo ini en los activos del archivo, el carácter de escape desaparece

Cuando Java lee un archivo, se divide en tres pasos.

El primer paso es obtener el flujo de entrada a través de inputStream.

Si imprime los datos leídos en secuencia, puede ver que el carácter de transferencia se lee

Properties properties = IniPropertiesReadUtils.loadFileFromAssetsNew(this, "jjapm1.ini");
     //读取Assets目录下的配置文件
    public static Properties loadFileFromAssetsNew(Context context, String filePath) {
    
    
        if (null == context || null == filePath || filePath.length() == 0)
            return null;

        InputStream assetFileIS = null;
        InputStreamReader assetFileISReader = null;
        Properties properties = new Properties();
        int readData = 0;
        try {
    
    
            assetFileIS = context.getResources().getAssets().open(filePath);
            while ((readData = assetFileIS.read())!= -1){
    
    
                Log.i(TAG,"read:" + (char)readData);
            }
        } catch (IOException e) {
    
    
            e.printStackTrace();
            properties = null;
        } finally {
    
    
            try {
    
    
                if (null != assetFileIS) {
    
    
                    assetFileIS.close();
                }
                if (null != assetFileISReader) {
    
    
                    assetFileISReader.close();
                }
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
        }
        return properties;
    }

inserte la descripción de la imagen aquí

2023-08-12 10:05:26.258 27428-27460/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read:c
2023-08-12 10:05:26.258 27428-27460/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read:l
2023-08-12 10:05:26.258 27428-27460/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read:a
2023-08-12 10:05:26.258 27428-27460/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read:s
2023-08-12 10:05:26.258 27428-27460/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read:s
2023-08-12 10:05:26.258 27428-27460/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read:R
2023-08-12 10:05:26.258 27428-27460/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read:u
2023-08-12 10:05:26.258 27428-27460/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read:l
2023-08-12 10:05:26.258 27428-27460/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read:e
2023-08-12 10:05:26.258 27428-27460/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read: 
2023-08-12 10:05:26.258 27428-27460/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read:=
2023-08-12 10:05:26.258 27428-27460/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read: 
2023-08-12 10:05:26.258 27428-27460/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read:ä
2023-08-12 10:05:26.258 27428-27460/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read:¸
2023-08-12 10:05:26.258 27428-27460/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read:­
2023-08-12 10:05:26.258 27428-27460/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read:{
    
    
2023-08-12 10:05:26.258 27428-27460/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read:\
2023-08-12 10:05:26.258 27428-27460/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read:d
2023-08-12 10:05:26.258 27428-27460/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read:\
2023-08-12 10:05:26.258 27428-27460/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read:d
2023-08-12 10:05:26.258 27428-27460/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read:"
2023-08-12 10:05:26.258 27428-27460/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read:}

Independientemente de la información de control impresa arriba, se puede ver que está impresa classRule = 中{\d\d"}, pero los caracteres chinos están confusos.

El segundo paso es obtener el flujo de caracteres de entrada a través de InputStreamReader y solucionar el problema confuso.

//读取Assets目录下的配置文件
    public static Properties loadFileFromAssetsNew(Context context, String filePath) {
    
    
        if (null == context || null == filePath || filePath.length() == 0)
            return null;

        InputStream assetFileIS = null;
        InputStreamReader assetFileISReader = null;
        Properties properties = new Properties();
        int readData = 0;
        try {
    
    
            assetFileIS = context.getResources().getAssets().open(filePath);
//            while ((readData = assetFileIS.read())!= -1){
    
    
//                Log.i(TAG,"read:" + (char)readData);
//            }
            assetFileISReader = new InputStreamReader(assetFileIS, "UTF-8");
            while ((readData = assetFileISReader.read())!= -1){
    
    
                Log.i(TAG,"read11:" + (char)readData);
            }
        } catch (IOException e) {
    
    
            e.printStackTrace();
            properties = null;
        } finally {
    
    
            try {
    
    
                if (null != assetFileIS) {
    
    
                    assetFileIS.close();
                }
                if (null != assetFileISReader) {
    
    
                    assetFileISReader.close();
                }
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
        }
        return properties;
    }
2023-08-12 10:06:52.827 27565-27600/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read11:c
2023-08-12 10:06:52.827 27565-27600/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read11:l
2023-08-12 10:06:52.827 27565-27600/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read11:a
2023-08-12 10:06:52.827 27565-27600/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read11:s
2023-08-12 10:06:52.827 27565-27600/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read11:s
2023-08-12 10:06:52.827 27565-27600/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read11:R
2023-08-12 10:06:52.827 27565-27600/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read11:u
2023-08-12 10:06:52.827 27565-27600/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read11:l
2023-08-12 10:06:52.827 27565-27600/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read11:e
2023-08-12 10:06:52.827 27565-27600/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read11: 
2023-08-12 10:06:52.827 27565-27600/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read11:=
2023-08-12 10:06:52.827 27565-27600/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read11: 
2023-08-12 10:06:52.827 27565-27600/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read11:2023-08-12 10:06:52.827 27565-27600/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read11:{
    
    
2023-08-12 10:06:52.827 27565-27600/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read11:\
2023-08-12 10:06:52.827 27565-27600/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read11:d
2023-08-12 10:06:52.827 27565-27600/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read11:\
2023-08-12 10:06:52.827 27565-27600/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read11:d
2023-08-12 10:06:52.827 27565-27600/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read11:"
2023-08-12 10:06:52.827 27565-27600/cn.jj.reg I/JJWorld.IniPropertiesReadUtils: read11:}

El personaje de escape todavía existe,classRule = 中{\d\d"}

El tercer paso properties.load(assetFileISReader) tiene un tratamiento especial para el carácter de escape, lo que hace que el carácter de escape no sea válido.

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Manejo de caracteres de escape por parte de JSONObject

    private void jsonRegTest() throws JSONException {
    
    
        String jsonStr = "{key:\"va\\lue\"}";
        // JSONObject对\的处理
        JSONObject jsonObject = new JSONObject(jsonStr);
        Log.i(TAG, "jsonRegTest:" + jsonObject.toString());
    }

inserte la descripción de la imagen aquí

    public JSONObject(@NonNull String json) throws JSONException {
    
    
        this(new JSONTokener(json));
    }

El nuevo JSONObject crea un JSONTokener. JSONTokener conserva la cadena entrante.

    public JSONTokener(String in) {
    
    
        // consume an optional byte order mark (BOM) if it exists
        if (in != null && in.startsWith("\ufeff")) {
    
    
            in = in.substring(1);
        }
        this.in = in;
    }

Código central JSONObject (Cadena)

    public JSONObject(@NonNull JSONTokener readFrom) throws JSONException {
    
    
        /*
         * Getting the parser to populate this could get tricky. Instead, just
         * parse to temporary JSONObject and then steal the data from that.
         */
        Object object = readFrom.nextValue();
        if (object instanceof JSONObject) {
    
    
            this.nameValuePairs = ((JSONObject) object).nameValuePairs;
        } else {
    
    
            throw JSON.typeMismatch(object, "JSONObject");
        }
    }

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_42015021/article/details/132237440
Recomendado
Clasificación