如何在字符串中找到无效的十六进制值?

时间:2014-09-11 20:22:18

标签: javascript regex

如何在变量中找到无效的十六进制代码?

有效的:

 A
 䄁

  -amp;#x41;
  -amp;#x4101;

在' x'之后必须有2或4个字符。然后';'

无效:

  &#x41
  &#x4110
  �

  -amp;#x41
  -amp;#x4110
  -amp;#x410110;
像这样的

字符串:

var  str = "Your done. -amp;#x2022No more late night... �no....";

我找到了这个正则表达式:

str.match(/(?:-amp;|&)#x\d{1,4}(?=[^;\n]*$)/ig);

但问题是它在x值hex之后不匹配超过4个字符:

-amp;#x410110;
 �
谢谢。

(我想找到像-amp; #x或&amp ;;#x开头但是没有&#34 ;;"或者在x之后有超过4或小于2的字符)

3 个答案:

答案 0 :(得分:0)

如果您只想允许2 4位数,则无法使用范围。

(?:-amp;|&)#x(?:\d\d|\d{4});

(?=[^;\n]*$)是一个非捕获前瞻,表示"在第四个数字之后,必须有零个或多个非;,非换行字符直到字符串结束"这实际上对我没有意义。

答案 1 :(得分:0)

您可以使用这样的正则表达式来匹配有效数据:

^&#x(\d{2}|\d{4});$

<强> Working demo

enter image description here

我们的想法是匹配仅包含&#x加上2或4个数字的字符串和;

因此,如果您想获取无效数据,可以使用discard技术并使用这样的正则表达式:

^&#x(?:\d{2}|\d{4});$|(.+)
^--- match valid but.. ^---- capture the rest (invalid data)

<强> Working demo

这意味着匹配有效字符串并将其丢弃,但抓住其余内容

匹配信息:

MATCH 1
1.  `&#x41`
MATCH 2
1.  `&#x4110`
MATCH 3
1.  `&#x410110;`
MATCH 4
1.  `-amp;#x41`
MATCH 5
1.  `-amp;#x4110`
MATCH 6
1.  `-amp;#x410110;`

答案 2 :(得分:0)

无效的十六进制位于第1组

 # /(?:-amp;|&)\#x(?![a-f0-9]{2}(?:[a-f0-9]{2})?;)([a-f0-9]*;?)/

 (?:
      -amp;
   |  & 
 )
 \#x
 (?!
      [a-f0-9]{2} 
      (?: [a-f0-9]{2} )?
      ;
 )
 (                             # (1 start)
      [a-f0-9]* 
      ;?
 )                             # (1 end)