Мне нравится понятие белого списка Eugene. Я должен был сделать подобную вещь как исходный плакат, но я должен был поддерживать все символы Unicode, не только до 0x00FD. Спецификация XML:
Символ = #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
В.NET, внутреннее представление символов Unicode составляет только 16 битов, таким образом, мы не можем 'позволить' 0x10000-0x10FFFF явно. Спецификация XML явно запрещает суррогатные кодовые точки, начинающие в 0xD800 с появления. Однако возможно, что, если мы позволили эти суррогатные кодовые точки в нашем белом списке, utf-8 кодирование нашей строки, мог бы произвести допустимый XML в конце, пока надлежащее кодирование utf-8 было произведено из суррогатных пар utf-16 символов в строке.NET. Я не исследовал это, хотя, таким образом, я пошел с более безопасной ставкой и не позволил суррогаты в своем белом списке.
комментарии в решении Eugene вводят в заблуждение, хотя, проблема состоит в том, что символы, которые мы исключаем, не допустимы в XML... они - совершенно допустимые кодовые точки Unicode. Мы не удаляем 'non-utf-8 символы. Мы удаляем utf-8 символы, которые не могут появиться в правильно построенных XML-документах.
public static string XmlCharacterWhitelist( string in_string ) {
if( in_string == null ) return null;
StringBuilder sbOutput = new StringBuilder();
char ch;
for( int i = 0; i < in_string.Length; i++ ) {
ch = in_string[i];
if( ( ch >= 0x0020 && ch <= 0xD7FF ) ||
( ch >= 0xE000 && ch <= 0xFFFD ) ||
ch == 0x0009 ||
ch == 0x000A ||
ch == 0x000D ) {
sbOutput.Append( ch );
}
}
return sbOutput.ToString();
}
, если у вас есть bash
str1="MATCH"
str2="match"
shopt -s nocasematch
case "$str1" in
$str2 ) echo "match";;
*) echo "no match";;
esac
, в противном случае вы должны указать нам, какую оболочку вы используете.
Альтернатива, используя awk
str1="MATCH"
str2="match"
awk -vs1="$str1" -vs2="$str2" 'BEGIN {
if ( tolower(s1) == tolower(s2) ){
print "match"
}
}'
Один из способов - преобразовать обе строки в верхнюю или нижнюю:
test $(echo "string" | /bin/tr '[:upper:]' '[:lower:]') = $(echo "String" | /bin/tr '[:upper:]' '[:lower:]') && echo same || echo different
Другой способ - использовать grep:
echo "string" | grep -qi '^String$' && echo same || echo different
grep
имеет флаг -i
, что означает нечувствительность к регистру, поэтому попросите его сообщить вам, находится ли var2 в var1.
var1=match
var2=MATCH
if echo $var1 | grep -i "^${var2}$" > /dev/null ; then
echo "MATCH"
fi