Java Implementation of Pythons string.replace()
import java.io.File;
import java.util.ArrayList;
/*
* IzPack - Copyright 2001-2008 Julien Ponge, All Rights Reserved.
*
* http://izpack.org/
* http://izpack.codehaus.org/
*
* Copyright 2003 Marc Eppelmann
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* A extended Java Implementation of Pythons string.replace()
*
* @author marc.eppelmann@gmx.de
*/
class StringTool
{
// ~ Constructors
// *********************************************************************************
/**
* Default Constructor
*/
public StringTool()
{
super();
}
// ~ Methods
// **************************************************************************************
/**
* Standalone callable Test method
*
* @param args Commandline Args
*/
public static void main(String[] args)
{
System.out.println("Test: string.replace(abc$defg,$de ,null ):"
+ StringTool.replace("abc$defg", "$de", null, true));
}
/**
* Replaces <b>from</b> with <b>to</b> in given String: <b>value</b>
*
* @param value original String
* @param from Search Pattern
* @param to Replace with this
* @return the replaced String
*/
public static String replace(String value, String from, String to)
{
return replace(value, from, to, true);
}
/**
* Replaces <b>from</b> with <b>to</b> in given String: <b>value</b>
*
* @param value original String
* @param from Search Pattern
* @param to Replace with this
* @param aCaseSensitiveFlag set to true be case sensitive.
* @return the replaced String
*/
public static String replace(String value, String from, String to, boolean aCaseSensitiveFlag)
{
if ((value == null) || (value.length() == 0) || (from == null) || (from.length() == 0))
{
return value;
}
if (to == null)
{
to = "";
}
if (!aCaseSensitiveFlag)
{
from = from.toLowerCase();
}
String result = value;
int lastIndex = 0;
int index = value.indexOf(from);
if (index != -1)
{
StringBuffer buffer = new StringBuffer();
while (index != -1)
{
buffer.append(value.substring(lastIndex, index)).append(to);
lastIndex = index + from.length();
index = value.indexOf(from, lastIndex);
}
buffer.append(value.substring(lastIndex));
result = buffer.toString();
}
return result;
}
/**
* Escapes all white Space Characters
* @param apathString
* @return
*/
public static String escapeSpaces( String aPathString )
{
return replaceOrEscapeAll( aPathString, null, null, true );
}
/**
* Escapes all white Space Characters
* @param apathString
* @return
*/
public static String replaceSpacesWithMinus( String aPathString )
{
return replaceSpaces( aPathString, "-" );
}
/**
* Escapes all white Space Characters
* @param apathString
* @return
*/
public static String replaceSpaces( String aPathString, String replaceWith )
{
return replaceOrEscapeAll( aPathString, replaceWith, null, false );
}
/**
* Replaces all given white Space Characters with the replaceOrEscapeWith or Escapes with replaceOrEscapeWith
*
* If true was given as Escape-Flag , the Method escapes each whitespace with the replaceOrEscapeWith + replaceWhat[x]
* Otherwise the replaces each replaceWhat[x] with the replaceOrEscapeWith.
*
* @param aPathString The input string in which the white space should be handled.
* @param replaceOrEscapeWith The Repace or Escape Char Interpreted depended on the escape Flag
* @param replaceWhat The atring array with the Characters, which should be replaced
* @param escape The flag, wihch indeicates, how to handle the given replaceOrEscapeWith String.
*
*/
public static String replaceOrEscapeAll( String aPathString, String replaceOrEscapeWith, String[] replaceWhat, boolean escape )
{
if( replaceWhat == null )
replaceWhat = new String[]{" ", "\t", "\n"};
if( replaceOrEscapeWith == null )
replaceOrEscapeWith = "\\";
for (int i = 0; i < replaceWhat.length; i++)
{
aPathString = replace(aPathString, replaceWhat[i], escape == true ? replaceOrEscapeWith + replaceWhat[i]: replaceOrEscapeWith );
}
return aPathString;
}
/**
* Normalizes a Windows or Unix Path.
* <p/>
* Reason: Javas File accepts / or \ for Pathes. Batches or ShellScripts does it not!
* <p/>
* TODO: implement support for MAC < MacOSX
*
* @param destination
* @param fileSeparator a target-system fileseparator
* @return the normalized path
*/
public static String normalizePath(String destination, String fileSeparator)
{
String FILESEP = (fileSeparator == null) ? File.separator : fileSeparator;
destination = StringTool.replace(destination, "\\", "/");
// all occs of "//" by "/"
destination = StringTool.replace(destination, "//", "/");
destination = StringTool.replace(destination, ":", ";");
destination = StringTool.replace(destination, ";", ":");
destination = StringTool.replace(destination, "/", FILESEP);
if ("\\".equals(FILESEP))
{
destination = StringTool.replace(destination, ":", ";");
// results in "C;\" instead of "C:\"
// so correct it:
destination = StringTool.replace(destination, ";\\", ":\\");
}
// Convert the file separator characters
return (destination);
}
/**
* Normalizes a mixed Windows/Unix Path. Does Only work for Windows or Unix Pathes Reason:
* Java.File accepts / or \ for Pathes. Batches or ShellScripts does it not!
*
* @param destination accepted mixed form by java.File like "C:/a/mixed\path\accepted/by\Java"
* @return the normalized Path
*/
public static String normalizePath(String destination)
{
return (normalizePath(destination, null));
}
/**
* Converts an String Array to a space separated String w/o any check
*
* @param args The StringArray
* @return the space separated result.
*/
public static String stringArrayToSpaceSeparatedString(String[] args)
{
String result = "";
for (String arg : args)
{
result += arg + " ";
}
return result;
}
public static String getPlatformEncoding()
{
// TODO Auto-generated method stub
return System.getProperty("file.encoding");
}
public static String UTF16()
{
return "UTF-16";
}
/**
* Transforms a (Array)List of Strings into a line.separator="\n" separated Stringlist.
*
* @param aStringList
* @return a printable list
*/
public static String stringArrayListToString(ArrayList aStringList)
{
return stringArrayListToString(aStringList, null);
}
/**
* Transforms a (Array)List of Strings into an aLineSeparator separated Stringlist.
*
* @param aStringList
* @return a printable list
*/
public static String stringArrayListToString(ArrayList aStringList, String aLineSeparator)
{
String LineSeparator = aLineSeparator;
if (LineSeparator == null)
{
LineSeparator = System.getProperty("line.separator", "\n");
}
StringBuffer temp = new StringBuffer();
for (Object anAStringList : aStringList)
{
temp.append(anAStringList).append(LineSeparator);
}
return temp.toString();
}
/**
* True if a given string starts with the another given String
*
* @param str The String to search in
* @param prefix The string to search for
* @return True if str starts with prefix
*/
public static boolean startsWith(String str, String prefix)
{
return (str != null) && str.startsWith(prefix);
}
/**
* The same as startsWith but ignores the case.
*
* @param str The String to search in
* @param prefix The string to search for
* @return rue if str starts with prefix
*/
public static boolean startsWithIgnoreCase(String str, String prefix)
{
return (str != null) && (prefix != null)
&& str.toUpperCase().startsWith(prefix.toUpperCase());
}
}
/////////////////////////////////////////
/*
* IzPack - Copyright 2001-2008 Julien Ponge, All Rights Reserved.
*
* http://izpack.org/
* http://izpack.codehaus.org/
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.izforge.izpack.util;
import junit.framework.TestCase;
public class StringToolTest extends TestCase
{
/*
* Class under test for String replace(String, String, String[, boolean])
*/
public void testReplace()
{
String ref = "ABC-012-def";
TestCase.assertEquals(null, StringTool.replace(null, null, null));
TestCase.assertEquals("ABC-012-def", StringTool.replace(ref, null, null));
TestCase.assertEquals("ABC-012-def", StringTool.replace(ref, "something", null));
TestCase.assertEquals("ABC012def", StringTool.replace(ref, "-", null));
TestCase.assertEquals("abc-012-def", StringTool.replace(ref, "ABC", "abc"));
TestCase.assertEquals("ABC-012-def", StringTool.replace(ref, "abc", "abc", false));
TestCase.assertEquals("ABC-012-def", StringTool.replace(ref, "abc", "abc", true));
}
/*
* Class under test for String normalizePath(String[, String])
*/
public void testNormalizePath()
{
TestCase.assertEquals("C:\\Foo\\Bar\\is\\so\\boring;plop;plop", StringTool.normalizePath(
"C:\\Foo/Bar/is\\so\\boring:plop;plop", "\\"));
TestCase.assertEquals("/some/where/that:matters:really", StringTool.normalizePath(
"/some/where\\that:matters;really", "/"));
}
}
Related examples in the same category