使用xpath检查字符串是否仅包含ASCII字符

时间:2018-07-25 14:40:08

标签: xpath ascii xquery

我正在尝试使用此查询contains($ASCIISupportAddressSet/ns2:Label,'[ -~\n\t]')检查字符串是否只有ASCII字符。但是我希望此伪代码与xpath一起使用:

if (matches('АДЫГЕЙСК',[A-Z]) then
  task 1
else 
  task 2.

如果可能的话,正确的xpath语法是什么?

2 个答案:

答案 0 :(得分:3)

正如@MadsHansen所说,但您也可以写

not(matches($x, "\P{IsBasicLatin}"))

如果字符串中包含非基本拉丁字符,则此处的matches()调用将返回true。 Unicode块BasicLatin将x00匹配为x7F,即有效的ASCII。

答案 1 :(得分:2)

如果正好有一个ASCII字符(例如空格),则测试正则表达式[ -~\n\t]是否与ASCII字符匹配将评估为true。您在评论中提到的示例值将通过。

用于测试值是否具有非ASCII字符的几种解决方案:

要确保仅在所有字符均为ASCII的情况下才匹配正则表达式,请通过在正则表达式的开头和结尾处添加^$来确保从头到尾锚定应用的字符类,并添加+以在两者之间需要一个到多个ASCII字符:

if ( fn:matches($ASCIISupportAddressSet/ns2:Label,'^[ -~\n\t]+$') ) ) then
  (: has ASCII characters - task 1 :)
else
  (: has non-ASCII-only characters - task 2 :)

或者,如果您取消了原始正则表达式,则可以轻松测试是否存在非ASCII字符:

if ( fn:matches($ASCIISupportAddressSet/ns2:Label,'[^ -~\n\t]') ) then
  (: has non-ASCII characters - task 2 :)
else
  (: has ASCII-only characters - task 1 :)

然后您可以用fn:not()取反,如果该值仅包含ASCII字符,则仍保留if / else调用任务1:

if ( fn:not( fn:matches($ASCIISupportAddressSet/ns2:Label,'[^ -~\n\t]') ) ) then
  (: has ASCII characters - task 1 :)
else
  (: has non-ASCII-only characters - task 2 :)
相关问题