วิธีการจับสตริงย่อยก่อนอักขระ jQuery หรือ JavaScript ที่ระบุ


238

ฉันพยายามดึงทุกอย่างก่อนเครื่องหมาย ',' คอมม่า ฉันจะทำสิ่งนี้ใน JavaScript หรือ jQuery ได้อย่างไร ฉันพยายามและไม่ทำงาน ..

1345 albany street, Bellevue WA 42344

ฉันต้องการคว้าที่อยู่

var streetaddress= substr(addy, 0, index(addy, '.')); 

29
addy.split(',', 1)[0]
antak

คำตอบ:


404
var streetaddress= addy.substr(0, addy.indexOf(',')); 

แม้ว่ามันจะไม่ใช่สถานที่ที่ดีที่สุดสำหรับข้อมูลที่ชัดเจนว่าแต่ละวิธีทำอย่างไร ( เครือข่ายนักพัฒนา mozillaดีกว่าสำหรับนั้น) w3schools.comเป็นสิ่งที่ดีสำหรับการแนะนำให้คุณรู้จักกับไวยากรณ์


22
สิ่งนี้จะไม่ทำงานหากสตริงที่ค้นหาไม่มีอินสแตนซ์ของอักขระการค้นหา มันจะส่งคืนสตริงว่าง
David G

1
substrไม่แนะนำ ควรใช้substringแทนที่จะเป็นdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/ …
Ben Creasy

152
var streetaddress = addy.split(',')[0];

10
swings and roundabouts - มันสร้างอาร์เรย์โดยไม่จำเป็น แต่อย่างน้อยก็ทำงานได้ถ้าตัวละครหยุดไม่ได้อยู่ในสตริง
Alnitak

2
สำหรับการเปรียบเทียบประสิทธิภาพดูที่: jsperf.com/street-array-vs-substr
Goodbye StackExchange

2
ลิงก์ความคิดเห็นก่อนหน้านี้ตาย: /
elki42

29

ลองนี้:

streetaddress.substring(0, streetaddress.indexOf(','));

1
ทำไมไม่รักคำตอบของฉัน? หากคำตอบนี้ถูกต้องstackoverflow.com/questions/3745515/…คำตอบของฉันถูกต้องเหมือนคำตอบที่ยอมรับและใช้ได้กับดัชนีเริ่มต้นอื่นที่ไม่ใช่ 0
Mikey G

8
ดังที่ David G ชี้ไว้ข้างต้นอาจเป็นเพราะมันใช้ไม่ได้หากไม่มีเครื่องหมายจุลภาค OP อาจมีนัยว่าสตริงจะมีเครื่องหมายจุลภาคเสมอ แต่ในหลาย ๆ กรณีตัวคั่นจะไม่รับประกัน ดูjsfiddle.net/13pkp1xn
Bumptious Q Bangwhistle

22
//split string into an array and grab the first item

var streetaddress = addy.split(',')[0];

นอกจากนี้ฉันขอแนะนำให้ตั้งชื่อตัวแปรด้วยอูฐ (streetAddress) เพื่อให้อ่านง่ายขึ้น


นี่เป็นวิธีที่ดีกว่าวิธีการใช้ indexof ในสถานการณ์ที่ไม่มีอักขระเครื่องหมายจุลภาค
eyal_katz

2
คุณสามารถบันทึกประมวลผลและการหยุดแยกบางในครั้งแรก "" พบได้โดยใช้สิ่งที่ @antak โพสต์เป็นความคิดเห็นในstackoverflow.com/a/22386366/601386addy.split(',', 1)[0] : ดูdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
ไข้หวัดใหญ่

การใช้ deconstruction อาร์เรย์คุณสามารถทำได้: const [streetAddress,] = addy.split(','); สิ่งนี้มีประโยชน์สำหรับกรณีที่คุณต้องการค่ามากกว่าหนึ่งค่าเช่น: let [callerIdName, callerId] = callerIdString.split('<'); (รูปแบบ callerIdString ดั้งเดิมคือ MCMULLIN, PARKER <+ 1XXXXXXXXXXXXXX)
parker_codes

1
คำตอบนี้ไม่เหมือนกับคำตอบที่โพสต์ในวันที่ 30 ต.ค. 2558 ใช่หรือไม่
kojow7

15

ถ้าคุณชอบมันสั้น ๆ เพียงใช้RegExp :

var streetAddress = /[^,]*/.exec(addy)[0];

4
+1, ฉันคิดว่านี่เป็นวิธีการที่สมเหตุสมผล แต่ฉันได้รับคำใบ้จากสิ่งนี้และไปด้วยaddy.split(',', 1)[0]
antak

3
วิธีนี้ดีมากถ้าคุณต้องการแยกพื้นที่สีขาว: / [^ \ s] * /. exec (... )
NuSkooler

12

เกือบจะเหมือนกันกับคำตอบของ David G แต่ไม่มีฟังก์ชั่นนิรนามหากคุณไม่รู้สึกอยากรวมไว้ด้วย

s = s.substr(0, s.indexOf(',') === -1 ? s.length : s.indexOf(','));

ในกรณีนี้เราใช้ประโยชน์จากข้อเท็จจริงที่ว่าอาร์กิวเมนต์ที่สองsubstrคือความยาวและเรารู้ว่าสตริงย่อยของเราเริ่มต้นที่ 0

คำตอบยอดนิยมไม่ใช่คำตอบทั่วไปเนื่องจากพฤติกรรมไม่พึงประสงค์หากสตริงไม่มีอักขระที่คุณต้องการ

หากคุณต้องการพฤติกรรมที่ถูกต้องในกรณีทั่วไปให้ใช้วิธีนี้หรือวิธีของ David G ไม่ใช่คำตอบที่ดีที่สุด

วิธีการ regex และการแยกจะทำงานเช่นกัน แต่อาจช้ากว่า / มากเกินไปสำหรับปัญหาเฉพาะนี้


8

shift()นอกจากนี้คุณยังสามารถใช้

var streetaddress = addy.split(',').shift();

ตามเอกสาร MDN Web:

shift()วิธีเอาแรกองค์ประกอบจากอาร์เรย์และผลตอบแทนว่าองค์ประกอบที่ถูกลบ วิธีนี้จะเปลี่ยนความยาวของอาร์เรย์

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/shift


การสร้างดัชนีด้วย [0] นั้นมีประสิทธิภาพมากกว่าการใช้. shift ()
MysteryPancake


4

หากคุณต้องการส่งคืนสตริงดั้งเดิมไม่ถูกแตะต้องหากไม่มีอักขระการค้นหาคุณสามารถใช้ฟังก์ชันที่ไม่ระบุชื่อ (การปิด):

var streetaddress=(function(s){var i=s.indexOf(',');
   return i==-1 ? s : s.substr(0,i);})(addy);

สิ่งนี้สามารถทำให้เป็นเรื่องทั่วไปมากขึ้น:

var streetaddress=(function(s,c){var i=s.indexOf(c);
   return i==-1 ? s : s.substr(0,i);})(addy,',');


2

คุณสามารถใช้ regex เพราะมันจะทำให้คุณสตริงถ้ามันตรงกับความต้องการ รหัสจะเป็นดังนี้:

const address = "1345 albany street, Bellevue WA 42344";
const regex = /[1-9][0-9]* [a-zA-Z]+ [a-zA-Z]+/;
const matchedResult = address.match(regex);

console.log(matchedResult[0]); // This will give you 1345 albany street.

ดังนั้นการทำลายรหัสลง [1-9][0-9]*โดยทั่วไปหมายถึงตัวเลขแรกไม่สามารถเป็นศูนย์และต้องเป็นตัวเลขระหว่าง1-9และหมายเลขถัดไปสามารถเป็นตัวเลขใดก็ได้จาก0-9และสามารถเกิดขึ้นได้ศูนย์หรือมากกว่าครั้งที่บางครั้งจำนวนนั้นเป็นเพียงหนึ่งหลักแล้วมันตรงกับช่องว่าง [a-zA-Z]โดยทั่วไปจะจับคู่ตัวพิมพ์ใหญ่ทั้งหมดกับตัวอักษรขนาดเล็กและต้องเกิดขึ้นหนึ่งครั้งหรือมากกว่าและจะเกิดขึ้นซ้ำ


0

คุณสามารถใช้Azleเพื่อรับสตริงย่อยก่อน :

str = 'This is how we go to the place!'

az.get_everything_before(str, 'place')

ผล : นี่คือวิธีที่เราไป

หลังจาก

str = 'This is how we go to the place!'

az.get_everything_after(str, 'go')

ผล : ไปยังสถานที่!

และระหว่าง :

str = 'This is how we go to the place!'

az.get_everything_between(str, 'how', 'place')

ผลลัพธ์ : เราไปที่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.