string - चींटी संपत्ति में अक्षर बदलना




ant (9)

चींटी Contrib से propertyregex कार्य का प्रयोग करें।

मुझे लगता है कि आप चाहते हैं:

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

दुर्भाग्य से दिए गए उदाहरण बहुत स्पष्ट नहीं हैं, लेकिन यह कोशिश करने लायक है। आपको यह भी जांचना चाहिए कि क्या होता है यदि कोई अंडरस्कोर नहीं है - आपको defaultValue विकल्प का भी उपयोग करने की आवश्यकता हो सकती है।

क्या किसी संपत्ति का मूल्य लेने का एक आसान तरीका है और फिर इसे किसी अन्य संपत्ति में प्रतिस्थापित कर दिया गया है जिसमें कुछ वर्ण बदल दिए गए हैं?

propA=This is a value कहो। मैं अंडरस्कोर में सभी रिक्त स्थानों को प्रतिस्थापित करना चाहता हूं, जिसके परिणामस्वरूप propB=This_is_a_value


उत्तर के लिए बस एक एफवाईआई चींटी संपत्ति में पात्रों को प्रतिस्थापित करना - यदि आप इसे मैवेन निष्पादन के अंदर उपयोग करने का प्रयास कर रहे हैं, तो आप सीधे मेवेन चर का संदर्भ नहीं दे सकते। आपको इस तरह कुछ चाहिए:

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

यदि एंटी-कॉन्ट्रिब एक विकल्प नहीं है, तो यहां जावा 1.6 के लिए एक पोर्टेबल समाधान है और बाद में:

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

यदि आप एक ऐसा समाधान चाहते हैं जो केवल एंटी बिल्ट-इन्स का उपयोग करता है, तो इस पर विचार करें:

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

आउटपुट ${propB} = "This_is_a_value"


या ... आप अपना खुद का कार्य भी आजमा सकते हैं

जावा कोड:

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

एंट स्क्रिप

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

कंसोल:

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

स्क्रिप्टिंग के बिना समाधान और एंटी-कॉनब्रिड जैसे बाहरी जार नहीं हैं:

यह चाल एएनटी के संसाधनों का उपयोग करना है:

  • "संसाधन संसाधन" नामक एक संसाधन प्रकार है जो एक स्रोत फ़ाइल की तरह है, लेकिन इस संसाधन के स्ट्रिंग मान से एक स्ट्रीम प्रदान करता है। तो आप इसे लोड कर सकते हैं और किसी भी कार्य में इसका उपयोग कर सकते हैं जैसे कि "प्रतिलिपि" जो फ़ाइलों को स्वीकार करता है
  • "Loadresource" कार्य भी है जो किसी भी संसाधन को किसी प्रॉपर्टी (उदाहरण के लिए, एक फ़ाइल) लोड कर सकता है, लेकिन यह हमारे प्रॉपर्टीसोर्स को भी लोड कर सकता है। यह कार्य कुछ टोकन रूपांतरणों को लागू करके इनपुट फ़िल्टर करने की अनुमति देता है। अंत में निम्नलिखित आप जो चाहते हैं वह करेंगे:
<loadresource property="propB">
  <propertyresource name="propA"/>
  <filterchain>
    <tokenfilter>
      <filetokenizer/>
      <replacestring from=" " to="_"/>
    </tokenfilter>
  </filterchain>
</loadresource>

यह प्रोपे में "_" द्वारा सभी को प्रतिस्थापित करेगा और परिणाम को प्रोप में रखेगा। "filetokenizer" पूरे इनपुट स्ट्रीम (हमारी संपत्ति) को एक टोकन के रूप में मानता है और उस पर स्ट्रिंग प्रतिस्थापन को लागू करता है।

आप अन्य टोकनफिल्टर का उपयोग करके अन्य फैंसी ट्रांसफॉर्मेशन कर सकते हैं: http://ant.apache.org/manual/Types/filterchain.html


दो संभावनाएं:

स्क्रिप्ट कार्य और बिल्टिन जावास्क्रिप्ट इंजन के माध्यम से (यदि 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>

या चींटी एडन फ्लाका का उपयोग कर

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

exisiting संपत्ति propa ओवरराइट करने के लिए बस propa के साथ propb को प्रतिस्थापित करें


एक उत्तर को पिछले उत्तर पर अधिक पूर्ण उदाहरण जोड़ना

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

निम्नलिखित कोड में निम्न आउटपुट है (निष्कर्ष यह है कि हम सरणी छोटे आकार आवंटित कुछ स्मृति संसाधनों को भी सहेज सकते हैं):

lookup = new bool[123];

for (var c = '0'; c <= '9'; c++)
{
    lookup[c] = true; System.Diagnostics.Debug.WriteLine((int)c + ": " + (char)c);
}

for (var c = 'A'; c <= 'Z'; c++)
{
    lookup[c] = true; System.Diagnostics.Debug.WriteLine((int)c + ": " + (char)c);
}

for (var c = 'a'; c <= 'z'; c++)
{
    lookup[c] = true; System.Diagnostics.Debug.WriteLine((int)c + ": " + (char)c);
}

48: 0  
49: 1  
50: 2  
51: 3  
52: 4  
53: 5  
54: 6  
55: 7  
56: 8  
57: 9  
65: A  
66: B  
67: C  
68: D  
69: E  
70: F  
71: G  
72: H  
73: I  
74: J  
75: K  
76: L  
77: M  
78: N  
79: O  
80: P  
81: Q  
82: R  
83: S  
84: T  
85: U  
86: V  
87: W  
88: X  
89: Y  
90: Z  
97: a  
98: b  
99: c  
100: d  
101: e  
102: f  
103: g  
104: h  
105: i  
106: j  
107: k  
108: l  
109: m  
110: n  
111: o  
112: p  
113: q  
114: r  
115: s  
116: t  
117: u  
118: v  
119: w  
120: x  
121: y  
122: z  

आप रूसी लोकेल का समर्थन करने के लिए निम्न कोड लाइन भी जोड़ सकते हैं (सरणी आकार 1104 होगा):

for (var c = 'А'; c <= 'Я'; c++)
{
    lookup[c] = true; System.Diagnostics.Debug.WriteLine((int)c + ": " + (char)c);
}

for (var c = 'а'; c <= 'я'; c++)
{
    lookup[c] = true; System.Diagnostics.Debug.WriteLine((int)c + ": " + (char)c);
}




string ant