string regular - Reemplazar caracteres en la propiedad Ant




otra por (9)

¿Existe una manera simple de tomar el valor de una propiedad y luego copiarlo en otra propiedad con ciertos caracteres reemplazados?

Diga propA=This is a value . Quiero reemplazar todos los espacios en subrayados, lo que resulta en propB=This_is_a_value .


Answers

Si ant-contrib no es una opción, aquí hay una solución portátil para Java 1.6 y posterior:

<property name="before" value="This is a value"/>
<script language="javascript">
    var before = project.getProperty("before");
    project.setProperty("after", before.replaceAll(" ", "_"));
</script>
<echo>after=${after}</echo>

Usa la tarea propertyregex de Ant Contrib .

Creo que quieres:

<propertyregex property="propB"
               input="${propA}"
               regexp=" "
               replace="_"
               global="true" />

Lamentablemente, los ejemplos dados no son muy claros, pero vale la pena intentarlo. También debe verificar qué sucede si no hay guiones bajos: es posible que también deba usar la opción defaultValue .


Agregar una respuesta más completa de ejemplo sobre una respuesta anterior

<property name="propB_" value="${propA}"/>
<loadresource property="propB">
  <propertyresource name="propB_" />
  <filterchain>
    <tokenfilter>
      <replaceregex pattern="\." replace="/" flags="g"/>
    </tokenfilter>
  </filterchain>
</loadresource>

O ... También puedes probar tu propia tarea

CÓDIGO JAVA:

class CustomString extends Task{

private String type, string, before, after, returnValue;

public void execute() {
    if (getType().equals("replace")) {
        replace(getString(), getBefore(), getAfter());
    }
}

private void replace(String str, String a, String b){
    String results = str.replace(a, b);
    Project project = getProject();
    project.setProperty(getReturnValue(), results);
}

..all getter and setter..

ANT SCRIPT

...
<project name="ant-test" default="build">

<target name="build" depends="compile, run"/>

<target name="clean">
    <delete dir="build" />
</target>

<target name="compile" depends="clean">
    <mkdir dir="build/classes"/>
    <javac srcdir="src" destdir="build/classes" includeantruntime="true"/>
</target>

<target name="declare" depends="compile">
    <taskdef name="string" classname="CustomString" classpath="build/classes" />
</target>

<!-- Replacing characters in Ant property -->
<target name="run" depends="declare">
    <property name="propA" value="This is a value"/>
    <echo message="propA=${propA}" />
    <string type="replace" string="${propA}" before=" " after="_" returnvalue="propB"/>
    <echo message="propB=${propB}" />
</target>

CONSOLA:

run:
     [echo] propA=This is a value
     [echo] propB=This_is_a_value

Dos posibilidades:

a través de una tarea de script y un motor de JavaScript incorporado (si usa jdk> = 1.6)

<project>

 <property name="propA" value="This is a value"/>

 <script language="javascript">
  project.setProperty('propB', project.getProperty('propA').
   replace(" ", "_"));
 </script>
 <echo>$${propB} => ${propB}</echo>

</project>

o usando Ant addon Flaka

<project xmlns:fl="antlib:it.haefelinger.flaka">

 <property name="propA" value="This is a value"/>

 <fl:let> propB := replace('${propA}', '_', ' ')</fl:let>

 <echo>$${propB} => ${propB}</echo>

</project>

sobrescribir la propiedad existente propA simplemente reemplace propB con propA


Aquí está la solución sin scripts y sin archivos externos como ant-conrib:

El truco es usar los recursos de ANT:

  • Hay un tipo de recurso llamado "propertyresource" que es como un archivo de origen, pero proporciona una secuencia desde el valor de cadena de este recurso. Entonces puede cargarlo y usarlo en cualquier tarea como "copiar" que acepte archivos
  • También existe la tarea "loadresource" que puede cargar cualquier recurso a una propiedad (por ejemplo, un archivo), pero este también podría cargar nuestro propertyresource. Esta tarea permite filtrar la entrada aplicando algunas transformaciones de token. Finalmente, lo siguiente hará lo que quieras:
<loadresource property="propB">
  <propertyresource name="propA"/>
  <filterchain>
    <tokenfilter>
      <filetokenizer/>
      <replacestring from=" " to="_"/>
    </tokenfilter>
  </filterchain>
</loadresource>

Éste reemplazará todo "" en propA por "_" y colocará el resultado en propB. "filetokenizer" trata el flujo de entrada completo (nuestra propiedad) como un token y solicita el reemplazo de cadena en él.

Puedes hacer otras transformaciones sofisticadas usando otros tokenfilters: http://ant.apache.org/manual/Types/filterchain.html


Solo un FYI para la respuesta Sustitución de caracteres en la propiedad Ant : si está intentando usar esto dentro de una ejecución de experto, no puede hacer referencia directamente a las variables maven. Necesitarás algo como esto:

...
<target>
<property name="propATemp" value="${propA}"/>
    <loadresource property="propB">
    <propertyresource name="propATemp" />
...

En caso de que quiera una solución que solo use complementos Ant, considere esto:

<target name="replace-spaces">
    <property name="propA" value="This is a value" />
    <echo message="${propA}" file="some.tmp.file" />
    <loadfile property="propB" srcFile="some.tmp.file">
        <filterchain>
            <tokenfilter>
                <replaceregex pattern=" " replace="_" flags="g"/>
            </tokenfilter>
        </filterchain>
    </loadfile>
    <echo message="$${propB} = &quot;${propB}&quot;" />
</target>

La salida es ${propB} = "This_is_a_value"


Una expresión regular se verá como:

public string RemoveSpecialChars(string input)
{
    return Regex.Replace(input, @"[^0-9a-zA-Z\._]", string.Empty);
}

Pero si el rendimiento es muy importante, te recomiendo que hagas algunos puntos de referencia antes de seleccionar la "ruta de expresiones regulares" ...







string ant