我所拥有的是一个表示十六进制数的输入字符串,例如:
E3E4E5E64E
我想使用正则表达式测试它,是否存在某个十六进制字节
在此十六进制字符串表示的数字中,例如:4E
。
当我尝试简单地匹配4E
时,我在字符串末尾的正确4E
字节和不形成字节的不正确4E
,但它只是E4
的最后一位数字
和E5
的第一位数。
是否可以编写正则表达式来操作字符对?
答案 0 :(得分:1)
/([A-Fa-f0-9]{2})/g
我猜你想要每2个十六进制字符。
http://www.regex101.com/r/nO5qL2
修改强>
好的,我现在明白你想要的是什么,你想在最后匹配4E,但不是像E4E5中的4E那样出现。
这里是:
/^([A-Fa-f0-9]{2})*(4E)/
第一组匹配0,2,4,... 2n个字符然后它将匹配4E组(4E不是必需的组,但更容易提取它)。
例:
http://www.regex101.com/r/iQ7uX4
当然,你可以用你想要的任何东西替换4E。 在RegExp结束时,Java RegExp可能需要。*,我现在无法测试。
答案 1 :(得分:1)
你可以试试这个正则表达式:
4E(?=(?:..)*$)
(?=(?:..)*$)
是lookahead assertion。仅当此断言为真时才匹配4E
。如果只有2个字符(?:..)*
的倍数直到结尾(由anchor $
确定),则此断言为真。
答案 2 :(得分:1)
试一试
/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
//Input String
String str = "4EE4E5E64E";
String splitArray,pattern="4E";
//Convert into json Array
splitArray=Arrays.toString(str.split("(?<=\\G.{2})"));
//Split based on ","
String[] tempArray = splitArray.split(",");
for(int i=0;i<tempArray.length;i++)
{
String compareString=tempArray[i];
//Remove whitespaces
compareString=compareString.replaceAll("\\s+","");
if(i==0||(i==tempArray.length-1))
{
if(i==0)
{
compareString=compareString.substring(1,3);
}else
{
compareString=compareString.substring(0,2);
}
}
//Compare with pattern string If yes goes inside
if(compareString.equalsIgnoreCase(pattern))
{
System.out.println("Yes");
}
}
}
}
您还可以使用JSONObject和JSONArray类来分割数组并与模式字符串进行比较。
答案 3 :(得分:0)
正则表达式非常有限。他们不能“理解”上下文。
有关详细信息,请参阅:
因此,使用标准正则表达式,无法区分4E
代表两个十六进制数E4E5
和一个形成十六进制字节4E
。
然而,没有什么能迫使你依赖正则表达式了!例如,如果您知道您的字符串仅包含十六进制字符串,则只能接受从偶数位置索引开始的正则表达式产生的那些匹配。
答案 4 :(得分:0)
我猜正则表达式:([4E] {2})可以很适合你...... !!