在「EmEditor」中,如果要將下列文字(數量很多,只摘錄部分而以)
由「A」型態轉成「B」,不知道應該作哪些步驟呢?
漢字日文數字「混搭」的狀態,似乎很複雜...。
「A」狀態:
孔庚居こうこうきょ 265 高鴻裁こうこうさい 265硬黄紙こうこうし 265皇輿造像銘こうこうぞうぞうめい 265 孔庚陶こうこうとう 265 黄公望こうこうぼう 265 高肱墓誌こうこうほし 265侯剛墓誌こうごうぽし 266孔康鏡こうこうよう 266 考古図こうこず 266
「B」狀態:
孔庚居 こうこうきょ 265
高鴻裁 こうこうさい 265
硬黄紙 こうこうし 265
皇輿造像銘 こうこうぞうぞうめい 265
孔庚陶 こうこうとう 265
黄公望 こうこうぼう 265
高肱墓誌 こうこうほし 265
侯剛墓誌 こうごうぽし 266
孔康鏡 こうこうよう 266
考古図 こうこず 266
PS:三種數列之間的空格為半形(全形亦可)
謝謝!
(\d+)\s*來搜尋,然後取代的話用:
\1\n就一次完成了。
fillano提到:
在UltraEdit裡面的話,使用perl格式的re,可以用:
檢視原始檔複製到剪貼簿列印關於
(\d+)\s*
來搜尋,然後取代的話用:
檢視原始檔複製到剪貼簿列印關於
\1\n
就一次完成了
(\d+)\s*取代:
\0\n是可行的。(在UltraEdit要用\1\n)
esyc提到:
請教一下
為啥後面的\s*取代後會消失?
(\d+)(\s*)取代:
\1\n\2
esyc提到:
D~
([㐀-鶴]+)\s*([ぁ-ヾ]+)\s*(\d+)\s*取代成:
\1 \2 \3\n這樣漢字、假名及數字之間會有一個空格,而在數字之後會分行。
應
在討論裡說明了一些可能的解法,
但從現有的 regular expression 無法解決辨識中文、平假名的問題。
用程式去判斷字碼屬於中文或平假名,
是可行的辦法,但從造輪子開始是蠻辛苦。
之前寫 有關 Regular Expression 正則表達式 的粗淺資源介紹 時,
其實是也想把 Oniguruma 介紹一下,
但沒什麼實際使用的經驗,
最多是在用 ultraviolet (在 Highlight 原始碼的方便工具 有提及),
或者要裝 Slide Show (S9) - A Free Web Alternative to PowerPoint and KeyNote in Ruby 套件的時候,
要用到而裝上 Oniguruma 而已。為了解這一題,用心地看了一下 Oniguruma for Ruby 的使用,
果然憑著多語言的 Oniguruma Regular Expressions 可以辨識平假名。
由於輸入的文字檔,是以 「中文、平假名、數字 」 規則地輪替出現,
所以就:
1.截前面屬中文的pattern
2.截剩下最前面的平假名pattern
3.截剩下最前面的數字pattern
4.剩下的,再從 1. 開始做。
其實就是簡單的遞迴做法。
利用了 Ouniguruma,在 ruby 程式語言環境:
<pre class="c" name="code">
require 'oniguruma'
$result = ''
def oneline(str)
if str.size > 3
zh_pat = Oniguruma::ORegexp.new('(\P{Hiragana}+)\s?(\p{Hiragana}+.*)','i','utf8')
matches = zh_pat.match(str)
zh = matches[1]
zhs = matches[2]
jp_pat = Oniguruma::ORegexp.new('(\p{Hiragana}+)\s?(\d+.*)','i','utf8')
matches2 = jp_pat.match(zhs)
jp = matches2[1]
jps = matches2[2]
int_pat = Oniguruma::ORegexp.new('(\d+)\s?(\P{Hiragana}+.*)','i','utf8')
unless jps =~ /^\d+$/
matches3 = int_pat.match(jps)
int = matches3[1]
ints = matches3[2]
else
int = jps
ints = ''
end
$result += "#{zh} #{jp} #{int}\n"
oneline(ints)
end
end
f = File.read('./file.txt')
oneline(f)
其中 \P{Hiragana} 是不合平假名字樣,小寫p 是合的,
match 出來成一 array,0是原整串,1是 back reference 的第一個,以此類推。
所以 zh, jp, int 是截到要的字串,剩下的以 zhs, jps, ints 代入下一個截取。
第4行,是假設最後會剩3個數字,所以只要是輸入的字串大於長度3才執行。
14~21行是剩最後一組數字的判斷,而設可結束遞迴的條件。
不大會說明,但程式碼蠻單純的,看了就理解是在幹什麼。
我將以上的程式碼,
做成線上就可執行:
http://alpha.tagbible.net/zhjp
以補無法在 EmEditor 處理之憾,
只要是符合 中、日、數 的連串文字,
就可排出以空格分欄的結果來。