2009-06-03 8 views
31

¿Hay alguna manera de extraer una subcadena de una propiedad Ant y colocar esa subcadena en su propiedad?Cómo extraer una subcadena en Ant

+0

¿Puede ser más específico acerca de lo que está tratando de hacer? ¿Por qué no tendría más sentido definir una propiedad para mantener el valor del que dependes y usarlo en varios lugares? Si sus propiedades Ant cambian con la frecuencia suficiente como para que deba reaccionar programáticamente ante ellas, es posible que esté haciendo algo incorrecto. – PanCrit

Respuesta

33

utilizo scriptdef para crear una etiqueta JavaScript para subcadena, por exemple:

<project> 
    <scriptdef name="substring" language="javascript"> 
    <attribute name="text" /> 
    <attribute name="start" /> 
    <attribute name="end" /> 
    <attribute name="property" /> 
    <![CDATA[ 
     var text = attributes.get("text"); 
     var start = attributes.get("start"); 
     var end = attributes.get("end") || text.length(); 
     project.setProperty(attributes.get("property"), text.substring(start, end)); 
    ]]> 
    </scriptdef> 
    ........ 
    <target ...> 
    <substring text="asdfasdfasdf" start="2" end="10" property="subtext" /> 
    <echo message="subtext = ${subtext}" /> 
    </target> 
</project> 
2

Me gustaría ir con la fuerza bruta y escribir una costumbre tarea Ant:

public class SubstringTask extends Task { 

    public void execute() throws BuildException { 
     String input = getProject().getProperty("oldproperty"); 
     String output = process(input); 
     getProject().setProperty("newproperty", output); 
    } 
} 

lo que queda es para implementar el String process(String) y añadir un par de fijadores (por ejemplo, para los valores oldproperty y newproperty)

21

Puedes probar usando PropertyRegex from Ant-conrtib.

<propertyregex property="destinationProperty" 
       input="${sourceProperty}" 
       regexp="regexToMatchSubstring" 
       select="\1" 
       casesensitive="false" /> 
+0

Nota adicional: en caso de que esto se haga dinámicamente en un bucle, use 'override =" true "' para anular cualquier valor anterior. – robinst

0

i usaría tarea secuencia de comandos para ese propósito, prefiero rubí, ejemplo cortar los primeros 3 caracteres =

<project> 
    <property name="mystring" value="foobarfoobaz"/> 
    <target name="main"> 
    <script language="ruby"> 
    $project.setProperty 'mystring', $mystring[3..-1] 
    </script> 
    <echo>$${mystring} == ${mystring}</echo> 
    </target>  
    </project> 

salida =

main: 
    [echo] ${mystring} == barfoobaz 

utilizando el api hormiga con El método project.setProperty() en una propiedad existente lo sobreescribirá, de esa manera usted puede evitar el comportamiento estándar de la hormiga , significa propert IES Una vez establecido son inmutables

+0

Hola, tengo este error: No se puede crear el motor de script javax para ruby ​​ –

+0

Jarod, necesitas bsf.jar (http://jakarta.apache.org/bsf) y jruby.jar (http: //www.jruby .org), consulte también http://ant.apache.org/manual/install.html#librarydependencies, tenga en cuenta que el enlace a jruby es incorrecto en esa página. – Rebse

+0

oh gracias Rubse –

8

Como yo prefiero usar la vainilla Hormiga, utilizo un archivo temporal. Funciona en todas partes y puede aprovechar replaceregex para deshacerse de la parte de la cadena que no desea. Ejemplo de munging mensajes de Git:

<exec executable="git" output="${git.describe.file}" errorproperty="git.error" failonerror="true"> 
     <arg value="describe"/> 
     <arg value="--tags" /> 
     <arg value="--abbrev=0" /> 
    </exec> 
    <loadfile srcfile="${git.describe.file}" property="git.workspace.specification.version"> 
     <filterchain> 
      <headfilter lines="1" skip="0"/> 
      <tokenfilter> 
       <replaceregex pattern="\.[0-9]+$" replace="" flags="gi"/> 
      </tokenfilter> 
      <striplinebreaks/> 
     </filterchain> 
    </loadfile> 
+4

Si está tratando con una propiedad para empezar, puede evitar el archivo haciendo algo como $ {property.here} Scott

+0

¡Gracias! Utilicé '' en lugar de exec y funcionó perfectamente –

Cuestiones relacionadas