У меня есть скрипт Groovy, который преобразует некоторые очень плохо отформатированные данные в XML. Эта часть отлично работает, но она также с радостью передает некоторые символы, которые недопустимы в XML. Поэтому я добавляю некоторый код, чтобы убрать их, и вот откуда возникает проблема.
Код, который не компилируется, таков:
def illegalChars = ~/[\u0000-\u0008]|[\u000B-\u000C]|[\u000E-\u001F]|[\u007F-\u009F]/
Что мне интересно, так это почему? Что я здесь не так делаю? Я протестировал это регулярное выражение в http://regexpal.com/, и оно работает как положено, но я получаю сообщение об ошибке при компиляции в Groovy:
[ОШИБКА] СТРОИТЬ ОШИБКУ
[ИНФОРМАЦИЯ] ----------------------------------------------- -------------------------
[INFO] строка 23:26: неожиданный символ: 0x0
Строка выше line 23
. Окружающие строки - это объявления переменных, которые я не изменил при работе с регулярным выражением.
Спасибо!
Обновление:
Код компилируется, но не фильтруется, как я ожидал.
В регулярное выражение я положил регулярное выражение:
[\ u0000- \ u0008 \ u000B- \ u000C \ u000E- \ u001F \ u007F- \ u009F]
и данные испытаний:
name='lang'>E</field><field name='title'>CHEMICAL IMMUNOLOGY AND ALLERGY</field></doc>
<doc><field name='page'>72-88</field><field name='shm'>3146.757500</field><field
name='pubc'>47</field><field name='cs'>1</field><field name='issue'>NUMBER</field>
<field name='auth'>Dvorak, A.</field><field name='pub'>KARGER</field><field
name='rr'>GBP013.51</field><field name='issn'>1660-2242</field><field
name='class1'>TS</field><field name='freq'>S</field><field
name='class2'>616.079</field><field name='text'>Subcellular Localization of the
Cytokines, Basic Fibroblast Growth Factor and Tumor Necrosis Factor- in Mast
Cells</field><field name='id'>RN170369808</field><field name='volume'>VOL 85</field>
<field name='year'>2005</field><field name='lang'>E</field><field
name='title'>CHEMICAL IMMUNOLOGY AND ALLERGY</field></doc><doc><field
name='page'>89-97</field><field name='shm'>3146.757500</field><field
name='pubc'>47</field><field name='cs'>1</field><field
Это захват из файла с одним из недопустимых символов, поэтому он немного случайный. Но regexpal выделяет только недопустимый символ, но в Groovy он заменяет даже символы «<» и «>» пустыми строками, поэтому фактически уничтожает весь документ.
Фрагмент кода:
def List parseFile(File file){
println "reading File name: ${file.name}"
def lineCount = 0
List data = new ArrayList()
file.eachLine {
String input ->
lineCount ++
String line = input
if(input =~ illegalChars){
line = input.replaceAll(illegalChars, " ")
}
Map document = new HashMap()
elementNames.each(){
token ->
def val = getValue(line, token)
if(val != null){
if(token.equals("ISSUE")){
List entries = val.split(";")
document.putAt("year",entries.getAt(0).trim())
if(entries.size() > 1){
document.putAt("volume", entries.getAt(1).trim())
}
if(entries.size() > 2){
document.putAt("issue", entries.getAt(2).trim())
}
} else {
document.putAt(token, val)
}
}
}
data.add(document)
}
println "done"
return data
}
Я не вижу причин, по которым эти двое должны вести себя по-разному; я что-то упустил?
Опять спасибо!