string - una - replace c# varios caracteres




Reemplazar caracteres en la propiedad Ant (7)

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>

¿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 .


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


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


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"


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>

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" />
...

Use alguna aplicación externa como sed:

<exec executable="sed" inputstring="${wersja}" outputproperty="wersjaDot">
  <arg value="s/_/./g"/>
</exec>
<echo>${wersjaDot}</echo>

Si ejecuta Windows obténgalo googleando para "gnuwin32 sed".

El comando s/_/./g reemplaza cada _ con . Esta secuencia de comandos va bien bajo Windows. Bajo linux arg puede ser necesario citar.





ant