2014-03-24 44 views
0

我正在嘗試讀取XML文件,並在使用textSize屬性的文本中隨處取代dpsp。例如android:textSize="8dp"將與android:textSize="8sp"被替換,如果下面的文件將被處理:用正則表達式替換文件中的文本

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
       xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" > 

    <TextView 
      android:id="@+id/description" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textSize="8dp"/> 

    <View    
      android:layout_width="wrap_content" 
      android:layout_height="5dp" /> 

</LinearLayout> 

我有以下代碼:

patternDp = /android:textSize=\"[\d]+dp\"/ 
content = File.read("layout/some_layout.xml") 
content.gsub!(patternDp, "???") 

我知道gsub!方法的第二個參數是字符串這將取代該模式,並且我在如何使用該方法時遇到一些困難,以至於該方法不能用該模式替換整個android:textSize="8dp"sp,而是僅使用dp字符串。

希望得到任何幫助,如果我的方法不正確,請告訴我如何以另一種方式解決問題。

+0

不要用正則表達式解析XML;除了控制XML生成的最簡單情況之外,正則表達式不是那麼好的工具。如果XML格式發生變化,您的模式將很可能會中斷。在* THIS *的情況下,你可以用一個簡單的'gsub'離開,因爲你並不想匹配標籤,但大多數情況下,使用Nokogiri會更好,並學會以正確的方式解析XML/HTML。 –

+0

很高興知道,謝謝。 –

回答

1

捕獲數字(\d+)並使用\\1代替捕獲。

input = input.gsub(/(?<=android:textSize=")(\d+)dp"/, '\\1sp"') 

(?<=android:textSize=")檢查是否數字是android:textSize="文本後或不那麼它不挑別人。

但是,如果你不希望使用後視(?<=...)那麼這個簡單的。

input = input.gsub(/android:textSize="(\d+)dp"/, 'android:textSize="\\1sp"') 
+0

謝謝。奇蹟般有效! –

相關問題