Tách biến thành 2 sau dấu chấm cuối cùng


1

Tôi cần cắt các biến trong hai biến nhỏ hơn sau dấu chấm cuối cùng. Ví dụ: biến " european.union" sẽ là vara=europeanvarb=union

Tôi sử dụng mã sau đây để thực hiện mục đích này:

for /f "tokens=1 delims=." %%a in ("%elvariato%") do set vara=%%a
for /f "tokens=2 delims=." %%a in ("%elvariato%") do set varb=%%a

Vấn đề là mã này không thể quản lý nhiều .biến phân tách "". Ví dụ, biến spain is in.the.european.unionhoàn toàn sẽ làm cho mã này trở nên vô dụng.

vara="spain is in" varb=the sẽ là đầu ra nhưng tôi cần vara="spain is in.the.european" varb=union

Đừng lo lắng về không gian var, tôi có thể quản lý chúng.

Tôi muốn phân tách biến ở dấu chấm cuối cùng .nhưng tôi không biết làm thế nào để thực hiện điều đó. Tôi đã cố đọc tổng số mã thông báo để hợp nhất tất cả các mã thông báo lên đến N-1 nhưng nó không hoạt động. Không thể biết số lượng dấu chấm trước khi biến được phân tích bởi tập lệnh làm cho nó hơi khó. Bất cứ đề nghị nào?

Câu trả lời:


2

đề nghị của tôi là sử dụng PowerShell ;-).

$text = "spain is in.the.european.union"
$vara = $text.Substring(0, $text.lastIndexOf('.'))
$varb = $text.Split(".")[-1]

đầu ra:

PS C:\WINDOWS\system32> $vara
spain is in.the.european

PS C:\WINDOWS\system32> $varb
union

để sử dụng tập lệnh này trong tập lệnh cmd, tập lệnh này sẽ được đặt %vara%%varb%chính xác, để sử dụng tập lệnh này trong tập lệnh cmd của bạn.

for /f "delims=" %%a in (' powershell "$env:elvariato.Substring(0, $env:elvariato.lastIndexOf('.'))" ') do set "vara=%%a"
for /f "delims=" %%a in (' powershell "$env:elvariato.split('.')[-1]" ') do set "varb=%%a"

%vara%chứa spain is in.the.european%varb%chứa uniontrong trường hợp này

Giải trình:

  • Substring(0, $text.lastIndexOf('.'))nhận mọi thứ từ đầu chuỗi ( 0) cho đến cuối cùng.
  • split('.')[-1] chia chuỗi của bạn trên mỗi dấu chấm và nhận giá trị cuối cùng trong mảng đã tạo

Thx, nó hoạt động !!!

1

Đoạn mã sau (nhận xét một phần) hiển thị giải pháp tệp bó thuần túy:

@ECHO OFF
rem default/expected: SETLOCAL EnableExtensions DisableDelayedExpansion
if "%~1"=="" (
  set "elvariato=spain is in.the.european.union"      asked example value
) else (
  set "elvariato=%~1"                                 supplied sample value 
)
set "_dot_pos="      
set "nodots=%elvariato:.=%"                           check for any dot presence
if "%nodots%"=="%elvariato%" goto :jjloopEnd          
set /a jj=1
:jjloop              compute last dot position (counted from the end of string)
  call set "_auxiliary=%%elvariato:~-%jj%%%"
  set "_aux_1char=%_auxiliary:~0,1%"
  if "%_aux_1char%"=="." (
      set /A _dot_pos=jj
      set /A _dot_pre=jj - 1
      goto :jjloopEnd
  )
  set /a jj+=1
  goto :jjloop
:jjloopEnd
if not defined _dot_pos (
    rem string does not contain any dot character at all
    set "vara=%elvariato%"
    set "varb="
    goto :showResults
)
call set "vara=%%elvariato:~0,-%_dot_pos%%%"
if %_dot_pos% EQU 1 (
    set "varb="
) else (
    call set "varb=%%elvariato:~-%_dot_pre%%%"
)
:showResults
rem debugging output 
echo vara="%vara%" varb="%varb%"
goto :eof

Đầu ra mẫu :

==> D:\bat\SU\1302882c.bat
vara="spain is in.the.european" varb="union"

==> D:\bat\SU\1302882c.bat "."      a dot only
vara="" varb=""

==> D:\bat\SU\1302882c.bat "nodots"
vara="nodots" varb=""

==> D:\bat\SU\1302882c.bat ".leading dot only"
vara="" varb="leading dot only"

==> D:\bat\SU\1302882c.bat "trailing dot only."
vara="trailing dot only" varb=""

==> D:\bat\SU\1302882c.bat "1st.dot.2nd.dot.another.dot.more.dots"
vara="1st.dot.2nd.dot.another.dot.more" varb="dots"

Tài nguyên (yêu cầu đọc, không đầy đủ):


0

Đây có thể là một trò gian lận, nhưng, miễn là dấu phân cách của bạn là dấu chấm (phần cứng .), bạn có thể sử dụng một mẹo: giả vờ rằng chuỗi của bạn là tên tệp:

setlocal enabledelayedexpansion
    ︙
for %%A in (%elvariato%) do set "vara=%%~nA" & set "varb_plus=%%~xA"
for /f "delims=. tokens=1" %%B in ("!varb_plus!") do set varb=%%B

%%~nA%%~xAxử lý %%Anhư một tên đường dẫn và trích xuất phần tên tệp cơ sở và phần mở rộng, tương ứng. Tên tệp cơ sở được xác định là mọi thứ cho đến dấu chấm cuối cùng, vì vậy đó là của bạn vara. Tiện ích mở rộng là dấu chấm cuối cùng và mọi thứ nằm sau nó (ví dụ: Giv .txt), đó không phải là điều bạn muốn. Vì vậy, chúng tôi gán phần mở rộng cho varb_plus- đó là giá trị mong muốn varbcộng với một dấu chấm. Sau đó, thật dễ dàng để sử dụng for /f "delims=. tokens=1" để có được phần sau dấu chấm.

Bởi vì %%~nAđang trả về một phần tên tệp cơ sở của %%A, điều này sẽ thất bại nếu biến đầy đủ của bạn chứa /hoặc \. Bạn có thể xử lý việc này bằng cách xem %%~pA (phần tên đường dẫn của %%A), nhưng không rõ ràng ngay lập tức cách thực hiện việc này - đặc biệt là nếu nó có thể chứa một trong hai / hoặc \.


Tôi có một số ý tưởng về cách xử lý dấu gạch chéo trong giá trị bằng cách thử nghiệm %%~pA; Hãy cho tôi biết nếu bạn cần chúng.
G-Man
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.