2015-04-29 308 views
0

这些问题有很多,但都集中在有几个字符。不含正则表达式的单词

在一个文本文件中,我有TXX和txx,我需要找到这些文件。但我也有Base64编码的图片。

含义I有

“图片”:“/ 9J/4AAQSkTXX

基本上TXXtxx可以Base64编码图片随机出现

予使用。。以下正则表达式:

(?<!"picture":")(?:(\w|\/|\+)+)(TXX|txx) 

我也意识到这可能应该改为:

(?<!"picture":")(?:(\d|\w|\/|\+|\=)+)(TXX|txx) 

但它说我正在做一个灾难性的回溯,甚至没有(?:)(非捕获组),它仍然无法正常工作。基本上,它只是不走“图片报”:”和第一个字符,并采取一切

因为我不能把一个正则表达式内的负压向后看与量词像

(?<!"picture":".+)TXX|txx 

我应该如何形成的正则表达式,使这些经过

"something-txx": "somerandomstring" 
value not picture: "some other stringtxxsome string" 

但这并不

"picture":"txxl5l71JGwnxMXAmJGOt8ZPwN24JNgtZpYHPBQLTViqVatk4ZoZhY+husj7Pgv3ag4NmpJ4CBlXudzydA5c+5QecmgaPz9vLrSbzRa+tNns0GjUfD+NSa5ZHo9KRf2nCWLl7360x2Kx8zA6dquNqubjoElpVRo2Dq0GOmZ8HMycktxxH08veKg84OPlCZvdDqvNxkPhOB0sn5wly+vdgx1Di82KzMxMlAoJQZkSJdGjZ0+UrlCJi/Xysc5GCPETtxxgUAgEAieNoQQLygg/P8K8VLaFCVVez+/SfMmPo74sNyxGz+/0YI8QKBQCAQCP4DPG6MeLrZcQvihFar46L6govdPE69movlMhIPh0NYaRJTtu2e+FQWyPkqDSsLqker0fKJVR0Oe5ap1RqoWD+pfuo7hefhbVJcfA8VlK42ycudJlIlMd1iMrnakePok5BPDyoUSvnhBMsEs9XMQ+PYrDQRqwd0Oj2vh/eVleXj5OMF7BSqhq2YjEa2TQ83nNDrPeHp5YWQEmXg4+vPPeLzIoR4gUAgEAcvvgETxtCiBcI/ifY2Y2aA57eWu7lJBAIBAKBQCB4eP62EC/JYWmoPBnFeieRnGKnk7e3yWTiYjN5fZPYLId5kcV67sHtcLBt+vZG4VzIu93lVe8SqUmsdzpsrDz7jse2tZrs+O/kxc7z5oGE/PtB+XOWs7tCtpB4z9NIkGf9YU3JeSmb0yV422np5AI8eaTXX" 

样品输入是: http://pastebin.com/5XJVNqGS (我知道引擎收录是不好的,因为到期,但我有粘贴文本的那个量的页面stucks问题)

其结果应是:

结果1: “一些-TXX”:值

结果2:hereisTXX: “1235”

Result3: “GROUPDATA”: “{DATA1:样品,TXX值:12312,DATA2:SAMPLE2}”

+0

获取JSON解析器,然后处理数据。您可能想要解码base64数据并找到确切的字节 - 以防止排除错误的数据。 – nhahtdh

+0

请显示CLEAR样本输入和您想要的输出。 –

+0

我可以提供一个示例输入和所需的输出,但这只是一个示例。我需要一个基本的案例。 将在短时间内附在原始帖子中的样本 –

回答

1

我相信你可以使用一个相当有用的Java“到一些-程度”可变宽度向后看:

(?<!"picture":"[^"]{0,10000})(?i:txx) 

您可以调整的情况下10000价值,你有较长的Base64编码字符串。

测试在RegexPlanet

如果你有非常大的图像,使用反向串招用颠倒正则表达式(查找aheads可未定义的变量大小):

String rx = "(?i)\"[^\"]*\"\\s*:\\s*\"[^\"]*xxt[^\"]*\"(?![^\"]*\":\"erutcip\")"; 

样品Java program on Ideone

import java.util.regex.*; 
class HelloWorld{ 

    public static void main(String []args){ 

    String str = "THE_HUIGE_STRING_THAT_CAUSED_Body is limited to 30000 characters;you entered 53501_ISSUE"; 
    str = new StringBuilder(str).reverse().toString(); 
    String rx = "\"?[^\"]*\"?\\s*\"?[^\"\\n\\r]*(?:xxt|XXT)[^\"\\n\\r]*(?![^\"]*\":\"erutcip\")"; 
    Pattern ptrn = Pattern.compile(rx); 
    Matcher m = ptrn.matcher(str); 
    while (m.find()) { 
     System.out.println(new StringBuilder(m.group(0)).reverse().toString()); 
    } 

    m = ptrn.matcher(new StringBuilder("\"something-txx\": \"somerandomstring\"").reverse().toString()); 
    while (m.find()) { 
     System.out.println(new StringBuilder(m.group(0)).reverse().toString()); 
    } 
    } 
} 
+0

是的,这对我来说并不适用,因为我不知道Base64编码字符串在执行前的长度:/ 另外我得到以下错误 '{{ 0,1000}后视需要为零宽度,因此量词不允许使用' 而对于1000000而言,它只是表示量词太大。 –

+0

但这些图像有多大? 10MB?我怀疑他们可以超过20MB。然后用'(?<!“picture”:“[^”] {0,20000000})(?i:txx)'尝试。或者您将需要使用反向字符串技巧。 –

+0

不幸的是,我看到RegexPlanet没有警告这一点。 Java在支持设置最小和最大参数的look-behind中支持一个量化符,但我不知道max参数的实际限制。所以,你只能使用反向字符串技巧。奇怪的是,在http://goo.gl/DZxwnX正则表达式编译得很好:( –